2013-01-01 72 views
4

我有簡單的功能裝飾System.Console.Out增添色彩

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

到調試輸出從Debug.WriteLine重定向到控制檯。

例如,我希望通過將Console.ForegroundColor設置爲灰色來以不同的顏色顯示調試輸出。很明顯,每次寫入後,顏色都需要重新設置,才能以標準顏色寫入普通文本。我的想法是通過一個不同的TextWriter來裝飾Write方法。

首先,這是一個明智的思考問題的方式嗎?其次,要做到這一點,我需要重寫我的TextWriter的所有方法,還是有不同的方法?

回答

5

Console.ForegroundColor具有屬性獲取器和設置器,所以它在技術上是可以簡單地存儲舊顏色,分配它,寫入和恢復舊顏色。

但是這樣做不是線程安全的。另一個線程也可能使用Console.Write並指定ForegroundColor屬性以獲取其自己的首選顏色。這是一場比賽,你的記錄器最終可能會用另一個線程選擇的顏色寫。另一種方式。有一個鎖可以防止兩個線程都將文本寫入控制檯並使輸出混合在一起,但是太遲了。沒有簡單的方法來解決這個問題,除了讓你的記錄器使用pinvoke,以至於它根本不需要使用ForegroundColor。

這是一個很難看的細節,如果有的話。這就是爲什麼通常使用日誌庫來處理這些令人討厭的小細節的好方法。例如NLog。

+0

謝謝。 NLog與ColoredConsole做了我所需要的。 –

3

您可以使用Printf.kprintf功能相當簡單的方式實現這一點,因爲在這個博客帖子證實:Colored printf

基本上,Printf.kprintf接受其格式的字符串應用於延續;我鏈接的博客文章展示瞭如何傳遞設置控制檯顏色的延續,打印字符串,然後在返回之前恢復原始顏色。

Hans Passant在他的回答中寫道,在設置/恢復控制檯顏色時存在線程安全問題,因此您應確保相應地設計您的應用程序(如果您使用多線程或F#async工作流)。