2012-02-29 15 views
1

System.Diagnostics名前空間(.NET 4)の各TraceListenerには、IsThreadSafeプロパティがあります。 .NET Tracingインフラストラクチャは、ロックを使用して、このプロパティに基づいてTraceListenerのTraceメソッドへの複数の呼び出しを同期させることを決定します。DefaultTraceListenerおよびスレッドセーフ

DefaultTraceListenerをBCLチームがThreadSafeではないとマークする必要性は何ですか?リスナーのコアロジックがこのであること(リフレクターから)表示されます:

private void internalWrite(string message) 
{ 
    if (Debugger.IsLogging()) 
    { 
     Debugger.Log(0, null, message); 
    } 
    else if (message == null) 
    { 
     SafeNativeMethods.OutputDebugString(string.Empty); 
    } 
    else 
    { 
     SafeNativeMethods.OutputDebugString(message); 
    } 
} 

Debugger.Log方法やOutputDebugString文字列へのアクセスを同期させる必要がありますか?

参考文献:OutputDebugStringへの書き込みに加えて

答えて

1

DefaultTraceListenerも1が指定されている場合はログファイルに書き込みます。ファイルにアクセスするためのロックは行われないため、スレッドセーフとマークされません。トレース・インフラストラクチャを使用して、メソッドへのアクセスをシリアライズします。次のように

我々は、ログファイル名を指定することができます。

<?xml version="1.0" encoding="UTF-8" ?> 
<configuration> 
    <system.diagnostics> 
     <assert logfilename="tracelog.txt" /> 
    </system.diagnostics> 
</configuration> 
関連する問題