2012-02-29 54 views
1

System.Diagnostics名稱空間(.NET 4)中的每個TraceListener都具有IsThreadSafe屬性。 .NET跟蹤基礎架構決定使用鎖來根據此屬性將多個調用同步到TraceListener的Trace方法。DefaultTraceListener和線程安全

BCL團隊需要將DefaultTraceListener標記爲不是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字符串?

參考文獻:

回答

1

除了寫OutputDebugString,該DefaultTraceListener還寫道,如果指定了一個日誌文件。它不會執行任何鎖定來訪問該文件,因此它不會被標記爲線程安全的。它依靠跟蹤基礎設施來序列化訪問它的方法。

我們可以按如下指定日誌文件名:

<?xml version="1.0" encoding="UTF-8" ?> 
<configuration> 
    <system.diagnostics> 
     <assert logfilename="tracelog.txt" /> 
    </system.diagnostics> 
</configuration>