我有一个多线程程序,我想使用Trace.WriteLine,并将输出重定向到文本文件:
_LogTracer = new System.Diagnostics.TextWriterTraceListener(logPath);
Trace.AutoFlush = true;
Trace.Listeners.Add(_LogTracer);
这足以保证线程安全吗?如果两个线程同时尝试写入输出文件怎么办?
答案 0 :(得分:2)
答案 1 :(得分:1)
{WRT。整体线程安全}
Trace.Listeners.Add
(或Remove
)在Trace.Write
(或WriteLine
)Trace.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
来获取锁定枚举和写入对所有听众。