根据
http://msdn.microsoft.com/en-us/library/ms733025.aspx XmlWriterTraceListener不是线程安全的. (我知道Microsoft.VisualBasic.Logging.FileLogTraceListener是,但我认为XmlWriterTraceListener格式使用Microsoft Service Trace Viewer更具可读性).
但是,我“仅”将它用于具有UI线程的桌面应用程序,并且最多使用2个BackgroundWorkers同时使用XmlWriterTraceListener作为源侦听器.
考虑到性能影响,在这种情况下,非线程安全的“相关性”如何?
跟踪消息相对比较难写,即不是每秒都写一次.
编辑:
UI线程和后台工作程序使用不同的TraceSource(每个都创建自己的).
TraceListener(目前FileLogTraceListener,因为我不确定线程安全)是App类中的静态公共属性.我将它添加到拥有TraceSource的类的构造函数中的TraceSources.
最佳答案 Trace类有一个属性
UseGlobalLock,如果底层监听器报告它们不是线程安全的,则该属性应为true.
换句话说,如果您正在使用与Debug或Trace类不是线程安全的跟踪侦听器,那么这些类(Trace / Debug)将确保以线程安全的方式处理基础侦听器.
换句话说,关于跟踪侦听器缺少线程安全性的相关性的问题,那么答案就不是很清楚了.从性能角度来看,它可能是相关的,如果你创建一个监听器,那么通过使监听器线程安全可以获得一些微小的性能,如果这可以用不同的方式处理,而不仅仅是围绕它的全局锁.
如果您不确定可以强制此属性为true,并且文档中有一个示例,说明如何执行此操作,Trace.UseGlobalLock Property:
<configuration>
<system.diagnostics>
<trace useGlobalLock="false" />
</system.diagnostics>
</configuration>
请注意,如果您将跟踪侦听器对象与Trace类之外的其他对象一起使用,则此答案不适用.
请注意,Debug类使用与Trace类相同的底层框架,但没有该属性.
Debug和Trace的当前实现是它们都包装了一个内部静态类,因此如果你添加一个调试监听器,它会被添加到trace中,反之亦然.因此,属性Trace.UseGlobalLock也适用于Debug.WriteXYZ.