4

我有简单的功能

let OutputDebugToConsole () =
    new System.Diagnostics.TextWriterTraceListener(System.Console.Out)
        |> System.Diagnostics.Debug.Listeners.Add |> ignore

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

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

首先,这是一种明智的思考问题的方式吗?其次,要做到这一点,我需要重写我的所有方法TextWriter还是有不同的方法?

4

2 回答 2

6

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

然而,这样做不是线程安全的。另一个线程也可以使用 Console.Write 并分配 ForegroundColor 属性来获得它自己的首选颜色。这是一场竞赛,您的记录器可能最终会使用其他线程选择的颜色进行书写。反之亦然。有一个锁可以防止两个线程将文本写入控制台并使它们的输出混合在一起,但是为时已晚。没有简单的方法可以解决这个问题,除了让您的记录器使用 pinvoke 以便它根本不需要使用 ForegroundColor。

如果有的话,那只是一个小细节。这就是为什么最好使用处理这些讨厌的小细节的日志库。以 NLog 为例。

于 2013-01-01T18:52:00.550 回答
3

您可以使用该函数以相当简单的方式实现这一点Printf.kprintf,如本博客文章所示:Colored printf

基本上,Printf.kprintf接受应用格式化字符串的延续;我链接的博客文章显示了如何传递设置控制台颜色的延续,打印字符串,然后在返回之前恢复原始颜色。

正如 Hans Passant 在他的回答中所写,设置/恢复控制台颜色存在线程安全问题,因此您应该确保相应地设计您的应用程序(如果您使用多线程或 F#async工作流程)。

于 2013-01-01T21:08:11.413 回答