如何在C#.NET中跨线程锁定控制台?

Laz*_*zlo 9 c# console logging locking

我有一个记录器类,处理各种颜色的信息显示(耶.).但是,因为它以分开的步骤写入控制台(即将颜色设置为红色,写入文本,将颜色设置为灰色,写入文本,以便呈现"[错误]描述...",错误为红色) ,但我有一个多线程应用程序,所以步骤可以混淆和随机颜色打印随机的东西.

我知道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);
            }
    }
Run Code Online (Sandbox Code Playgroud)

jas*_*onh 21

你的班级需要:

private static readonly object ConsoleWriterLock = new object();
Run Code Online (Sandbox Code Playgroud)

然后你可以在写入控制台之前锁定它.

lock(ConsoleWriterLock)
{
     //Your code here
}
Run Code Online (Sandbox Code Playgroud)

lock关键字将与静态类一起使用,您只需要提供一个static readonly要锁定的对象.

  • @jasonh如果另一个应用程序同时写入控制台怎么办?(当然不使用此记录器) (2认同)