如何"相关"是XmlWriterTraceListener的非线程安全性?

时间:2014-07-30 13:00:50

标签: c# .net multithreading thread-safety tracing

根据http://msdn.microsoft.com/en-us/library/ms733025.aspx XmlWriterTraceListener不是线程安全的。 (我知道Microsoft.VisualBasic.Logging.FileLogTraceListener是,但我认为XmlWriterTraceListener格式使用Microsoft Service Trace Viewer更易读。)

但是,我“仅”将它用于具有UI线程的桌面应用程序,并且最多使用2个BackgroundWorkers同时使用XmlWriterTraceListener作为 Source 侦听器。 考虑到性能影响,在这种情况下,非线程安全的“相关性”如何? 跟踪消息写得相对比较恐怖,即不是每一秒。

编辑: UI线程和后台工作程序使用不同的TraceSource(每个都创建自己的)。 TraceListener(目前FileLogTraceListener,因为我不确定线程​​安全)是App类中的静态公共属性。我将它添加到拥有TraceSource的类的构造函数中的TraceSources。

1 个答案:

答案 0 :(得分:2)

Trace类有一个属性UseGlobalLock,如果基础监听器报告他们不是线程安全的,那么它应该是true

换句话说,如果您使用的跟踪侦听器与DebugTrace类不是线程安全的,那么这些类(Trace / Debug)将确保以线程安全的方式处理底层侦听器。

换句话说,关于跟踪侦听器缺少线程安全性的相关性的问题,那么答案是不是很。从性能角度来看,它可能是相关的,如果你创建一个监听器,那么通过使监听器线程安全可以获得一些小的性能,如果这可以用不同的方式处理,而不仅仅是围绕它的全局锁。

如果您不确定,可以强制此属性为true,文档中有一个示例,说明如何执行此操作,Trace.UseGlobalLock Property

<configuration>
  <system.diagnostics>
    <trace useGlobalLock="false" />
  </system.diagnostics>
</configuration>

请注意,如果您使用跟踪侦听器对象而不是Trace类,则此答案不适用。

请注意,Debug类使用与Trace类相同的基础框架,但没有该属性。

DebugTrace的当前实现是它们都包装了一个内部静态类,因此如果你添加一个调试监听器,它会被添加到跟踪中,反之亦然。因此,属性Trace.UseGlobalLock也适用于Debug.WriteXYZ