Как заблокировать консоль между потоками в C # .NET? - PullRequest
9 голосов
/ 06 октября 2009

У меня есть класс logger , который обрабатывает различную информацию с красивыми цветами (ура). Однако, поскольку он выполняет запись в консоль в отдельных шагах (, т. Е. Устанавливает цвет на красный, пишет текст, устанавливает серый цвет, пишет текст для чего-то, что будет отображаться »[Ошибка] Описание .. . "с ошибкой, выделенной красным ), но у меня есть многопоточное приложение, поэтому шаги можно перепутать и напечатать случайные вещи в случайных цветах.

Мне известно о ключевом слове 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 Ответ

20 голосов
/ 06 октября 2009

Вашему классу нужно:

private static readonly object ConsoleWriterLock = new object();

Затем вы можете заблокировать это перед записью на консоль.

lock(ConsoleWriterLock)
{
     //Your code here
}

Ключевое слово lock будет работать со статическим классом, вам просто нужно предоставить объект static readonly для блокировки.

...