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 プロパティを割り当てて独自の優先色を取得することもできます。それは競争です。あなたのロガーは、他のスレッドによって選択された色で書くことになるかもしれません。そしてその逆です。両方のスレッドがテキストをコンソールに書き込み、それらの出力が混在するのを防ぐロックがありますが、遅すぎます。ForegroundColor をまったく使用する必要がないように、ロガーで pinvoke を使用する以外に、これを解決する簡単な方法はありません。

あったとしても、それはばかげた小さな詳細です。そのため、通常、これらの厄介な詳細を処理するロギング ライブラリを使用する方が適切です。たとえば、NLog。

于 2013-01-01T18:52:00.550 に答える
3

Printf.kprintfこのブログ投稿で示されているように、関数を使用してこれをかなり簡単な方法で実装できます: Colored printf

基本的にPrintf.kprintf、フォーマットされた文字列が適用される継続を受け入れます。私がリンクしたブログ投稿は、コンソールの色を設定し、文字列を印刷し、戻る前に元の色に戻す継続を渡す方法を示しています。

Hans Passantが回答に書いたように、コンソールの色の設定/復元にはスレッドセーフの問題があるため、それに応じてアプリケーションを設計する必要があります(複数のスレッドまたはF#asyncワークフローを使用している場合)。

于 2013-01-01T21:08:11.413 に答える