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

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

我知道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); } } 

你的class级需要:

 private static readonly object ConsoleWriterLock = new object(); 

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

 lock(ConsoleWriterLock) { //Your code here } 

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