Как заблокировать консоль между потоками в 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 объект для блокировки.

Другие вопросы по тегам