2012-02-29 69 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>