我正在开发多线程应用程序(服务器),它基本上是一个控制台应用程序。我在其中向控制台显示处理日志,默认情况下为白色。 但在成功的交易中,我以绿色显示文本,在不成功的交易中,我以红色显示文本。为此,我在 Program.cs 中设置了三个独立的函数。
对于简单的日志
public static void Write(string text)
{
try
{
Console.Out.Write(text);
}
catch (Exception)
{ }
}
对于不成功的交易,我将颜色更改为红色,然后打印,然后变回白色
public static void WriteError(string text)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("\t" + text);
Console.ForegroundColor = ConsoleColor.White;
}
为了成功交易,我将颜色更改为绿色,然后打印,然后变回白色
public static void WriteSuccess(string text)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("\t" + text);
Console.ForegroundColor = ConsoleColor.White;
}
问题是当超过 200 个客户端连接并且每个客户端的事务日志都在控制台上打印时。当我将单行的颜色更改为绿色时,它也会导致许多其他行的正常日志也变为绿色。 所以请告诉我如何解决这个问题。
最佳答案
如果您的类是唯一一个正在写入控制台的类,那么正如其他人提到的那样,锁定单个私有(private)对象将起作用。
但如果有其他写者,您还需要与他们同步,否则他们可能会在您在锁中时写。如果查看 Console
的实现,您会注意到 Console.Out
是一个 SyncTextWriter
。 ,它自身同步(使用 [MethodImplAttribute(MethodImplOptions.Synchronized)]
)。这意味着如果您使用它作为您的同步对象,您将与其他作者同步:
lock (Console.Out)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("\t" + text);
Console.ForegroundColor = ConsoleColor.White;
}
如果其他编写器也设置颜色并使用他们自己的同步对象,这仍然无法正常工作。但如果其他编写器也在 Console.Out
上同步,它就会起作用。
这种方法的问题是它依赖于实现细节,但我不知道有什么更好的解决方案。
关于c# - 更改控制台颜色在多线程应用程序中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13861431/