c# - 更改控制台颜色在多线程应用程序中无法正常工作

标签 c# console thread-safety

我正在开发多线程应用程序(服务器),它基本上是一个控制台应用程序。我在其中向控制台显示处理日志,默认情况下为白色。 但在成功的交易中,我以绿色显示文本,在不成功的交易中,我以红色显示文本。为此,我在 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/

相关文章:

c# - 如何替换 Entity Framework FirstOrDefaultAsync

c++ - C++ 的线程安全 vector 类

java 检测对象中没有其他线程

symfony - 如何将依赖项注入(inject) Symfony 控制台命令?

mysql - 如何使用MySQL实现nodeJs服务器上多个用户的安全读写操作,避免不一致状态?

c# - Entity Framework -通过同一列中的多个条件选择-引用表

c# - .NET Native 编译器不断抛出编译错误

c# - 通过复选框以编程方式为 MVC 4 中的用户分配角色

c# - 有没有办法让 Int 变量等于(==)数组中存储的所有数字?

java - Win32 STD_INPUT_HANDLE/ReadConsoleInput : How to write to it from Java?