DefaultTraceListener和Thread Safety

时间:2012-02-29 22:47:32

标签: .net logging thread-safety

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字符串的访问权限?

参考文献:

1 个答案:

答案 0 :(得分:1)

除了写入OutputDebugString之外,如果指定了DefaultTraceListener<?xml version="1.0" encoding="UTF-8" ?> <configuration> <system.diagnostics> <assert logfilename="tracelog.txt" /> </system.diagnostics> </configuration> 也会写入日志文件。它不会进行任何锁定来访问该文件,因此,它没有标记为线程安全。它依赖于跟踪基础结构来序列化对其方法的访问。

我们可以按如下方式指定日志文件名:

{{1}}