根据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。
答案 0 :(得分:2)
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.UseGlobalLock
也适用于Debug.WriteXYZ
。