C# Trace.WriteLine线程安全吗?

C# Trace.WriteLine线程安全吗?,c#,thread-safety,trace,C#,Thread Safety,Trace,我有一个多线程程序,我想使用Trace.WriteLine,并将输出重定向到文本文件: _LogTracer = new System.Diagnostics.TextWriterTraceListener(logPath); Trace.AutoFlush = true; Trace.Listeners.Add(_LogTracer); 这足以保证线程安全吗?如果两个线程同时试图写入输出文件,该怎么办?来自: 线程安全 这种类型是线程安全的 发件人: 线程安全 这种类型是线程安全的

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

_LogTracer = new System.Diagnostics.TextWriterTraceListener(logPath);   
Trace.AutoFlush = true;
Trace.Listeners.Add(_LogTracer); 
这足以保证线程安全吗?如果两个线程同时试图写入输出文件,该怎么办?

来自:

线程安全 这种类型是线程安全的

发件人:

线程安全 这种类型是线程安全的


{wrt.total thread safety}

明确禁用Trace.Write或WriteLine时,使用Trace.Listeners.Add或Remove对于Trace.Write或WriteLine而言不是线程安全的

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

我有一些老掉牙的代码修改了侦听器集合,这可能会在多线程环境中导致错误:

[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.GetEnumerator并没有像提示的那样在副本上建立锁。线程安全锁仅通过几个单独的添加/删除方法获得


要使Trace.Write线程在修改侦听器时安全,需要使用它来获取对所有侦听器的枚举和写入的锁。

{wrt.total thread safety}

明确禁用Trace.Write或WriteLine时,使用Trace.Listeners.Add或Remove对于Trace.Write或WriteLine而言不是线程安全的

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

我有一些老掉牙的代码修改了侦听器集合,这可能会在多线程环境中导致错误:

[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.GetEnumerator并没有像提示的那样在副本上建立锁。线程安全锁仅通过几个单独的添加/删除方法获得


要使Trace.Write线程安全地修改侦听器,需要使用它来获得对所有侦听器的枚举和写入的锁。

您至少可以读取第一个吗?这种类型是线程安全的。线程安全不是一个很好的描述,因为通常情况下,如果有多个线程与共享数据结构混在一起,并且该类型具有某些在多线程环境中仍然适用的期望,那么它最多只能确保程序不会崩溃。除此之外,它几乎没有说明其他行为。例如,您希望多个Trace.Write调用的行为如何?在最终输出中总是在一起吗?它们是否可以被另一个线程分割,并在这两个线程之间写入一些内容?您是否至少可以阅读第一个线程?这种类型是线程安全的。线程安全不是一个很好的描述,因为通常情况下,如果有多个线程与共享数据结构混在一起,并且该类型具有某些在多线程环境中仍然适用的期望,那么它最多只能确保程序不会崩溃。除此之外,它几乎没有说明其他行为。例如,您希望多个Trace.Write调用的行为如何?在最终输出中总是在一起吗?它们是否可以被另一个线程分割,并在其间编写一些东西?使用Trace.Listeners.Add_LogTracer;,哪些源代码具有良好的模式?使用锁?重线程代码开始阻塞长达12秒!!在Trace.WriteLine上,因为它必须在DefaultTraceListener中的琐碎工作上获得锁。因此它是线程安全的:D-除了修改侦听器的短暂时刻外,我们的系统都没有使用默认编写器并显式禁用锁。使用Trace.listeners.Add_LogTracer;,哪些源代码具有良好的模式?使用锁?重线程代码开始阻塞长达12秒!!在Trace.WriteLine上,因为它必须在DefaultTraceListener中的琐碎工作上获得锁。因此它是线程安全的:D-除了修改侦听器的短暂时刻外,我们的系统都没有使用默认写入程序并显式禁用锁。