Trace.WriteLine线程安全吗?

时间:2015-10-27 07:48:20

标签: c# thread-safety trace

我有一个多线程程序,我想使用Trace.WriteLine,并将输出重定向到文本文件:

_LogTracer = new System.Diagnostics.TextWriterTraceListener(logPath);   
Trace.AutoFlush = true;
Trace.Listeners.Add(_LogTracer); 

这足以保证线程安全吗?如果两个线程同时尝试写入输出文件怎么办?

2 个答案:

答案 0 :(得分:2)

来自MSDN 此类型是线程安全的

请参阅此link

答案 1 :(得分:1)

{WRT。整体线程安全}

Trace.Listeners.Add(或Remove)在Trace.Write(或WriteLineTrace.UseGlobalLock时,使用{em> 线程安全明确禁用。

Write的线程安全 - 或缺少 - 仅适用于单个跟踪侦听器类型(如前所述,TextWriterTraceListener实现是线程安全的)或通过全局跟踪锁保护(请参阅TraceListener.IsThreadSafe讨论)。

我有一些陈旧的旧代码修改了可能导致多线程环境中的错误的Listener集合:

[System.InvalidOperationException]
Collection was modified; enumeration operation may not execute.
-------------------------------------------------- -- >
   at System.Collections.ArrayList.ArrayListEnumeratorSimple.MoveNext()
   at System.Diagnostics.TraceInternal.WriteLine(String message, String category)

文档说Listeners是线程安全的并且有点误导:Listeners.GetEnumerator 建立锁定的锁定副本。仅通过几个单独的添加/删除方法获取线程安全锁。

要使修改 Trace.Write的{​​{1}}线程安全,需要使用Trace.UseGlobalLock来获取锁定枚举和写入对所有听众。