Как заблокировать консоль между потоками в C#.NET?
У меня есть класс логгера, который обрабатывает различную информацию красивыми цветами (ура). Тем не менее, поскольку он выполняет запись в консоль в несколько этапов (то есть установите цвет на красный, напишите текст, установите цвет на серый, напишите текст для чего-то, что выдает "[Error] Description..." с ошибкой красного цвета), но у меня есть многопоточное приложение, поэтому шаги могут быть перепутаны и печатать случайные вещи в случайных цветах.
Я знаю о lock
ключевое слово, однако оно не будет работать со статическим классом, таким как консоль.
Вот пример кода, если мне было неясно:
using System;
using System.Text;
namespace N.Utilities.IO
{
public static class Logger
{
private static void WriteColored(string value, ConsoleColor color)
{
if (Logger.UseColor)
{
Console.ForegroundColor = color;
Console.Write(value);
Console.ForegroundColor = ConsoleColor.Gray;
}
else
{
Console.Write(value);
}
}
private static void WriteLineColored(string value, ConsoleColor color)
{
if (Logger.UseColor)
{
Console.ForegroundColor = color;
Console.WriteLine(value);
Console.ForegroundColor = ConsoleColor.Gray;
}
else
{
Console.Write(value);
}
}
private static bool useColor = true;
public static bool UseColor
{
get
{
return Logger.useColor;
}
set
{
Logger.useColor = value;
}
}
public static void Inform(string value)
{
Logger.WriteColored(" [Info] ", ConsoleColor.White);
Console.WriteLine(value);
}
public static void Warn(string value)
{
Logger.WriteColored(" [Warning] ", ConsoleColor.Yellow);
Console.WriteLine(value);
}
public static void Error(string value)
{
Logger.WriteColored(" [Error] ", ConsoleColor.Red);
Console.WriteLine(value);
}
}
1 ответ
Вашему классу нужны:
private static readonly object ConsoleWriterLock = new object();
Затем вы можете заблокировать это перед записью в консоль.
lock(ConsoleWriterLock)
{
//Your code here
}
Ключевое слово lock будет работать со статическим классом, вам просто нужно предоставить static readonly
объект для блокировки.