System.Diagnostics命名空间(.NET 4)中的每个TraceListener都具有IsThreadSafe属性。 .NET跟踪基础结构决定使用锁来基于此属性同步对TraceListener的Trace方法进行多次调用。
BCL团队需要将DefaultTraceListener标记为不是ThreadSafe吗?它(来自Reflector)似乎是侦听器的核心逻辑:
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
字符串的访问权限?
参考文献:
答案 0 :(得分:1)
除了写入OutputDebugString
之外,如果指定了DefaultTraceListener
,<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<system.diagnostics>
<assert logfilename="tracelog.txt" />
</system.diagnostics>
</configuration>
也会写入日志文件。它不会进行任何锁定来访问该文件,因此,它没有标记为线程安全。它依赖于跟踪基础结构来序列化对其方法的访问。
我们可以按如下方式指定日志文件名:
{{1}}