装饰System.Console.Out添加颜色

Muh*_*uri 4 .net f# console-application

我有简单的功能

let OutputDebugToConsole () =
    new System.Diagnostics.TextWriterTraceListener(System.Console.Out)
        |> System.Diagnostics.Debug.Listeners.Add |> ignore
Run Code Online (Sandbox Code Playgroud)

将调试输出重定向Debug.WriteLine到控制台.

我希望通过设置Console.ForegroundColor为灰色来调试输出为不同的颜色,例如.显然,每次写入后都需要重置颜色,以便以标准颜色书写普通文本.我的想法是通过一个不同的TextWriter装饰Write方法.

首先,这是一种思考问题的合理方式吗?第二,要做到这一点,我需要重写我的所有方法TextWriter还是有不同的方法?

Han*_*ant 5

Console.ForegroundColor具有属性getter和setter,因此技术上可以简单地存储旧颜色,分配,写入和恢复旧颜色.

但是,这样做不是线程安全的.另一个线程也可以使用Console.Write并指定ForegroundColor属性以获取其自己的首选颜色.这是一场比赛,你的记录器最终可能会用另一个线程选择的颜色进行书写.反过来说.有一个锁可以阻止两个线程将文本写入控制台并使其输出混合,但是这样做太迟了.除了让你的记录器使用pinvoke以便它根本不需要使用ForegroundColor之外,没有简单的方法可以解决这个问题.

如果有的话,这是一个非常简单的细节.这就是为什么通常最好使用一个记录库来处理这些讨厌的小细节.例如NLog.