如何“relevant"是xmlwritertracellistener的非线程安全性
本文关键字:xmlwritertracellistener 线程 安全性 relevant quot 如何 | 更新日期: 2023-09-27 18:15:42
根据http://msdn.microsoft.com/en-us/library/ms733025.aspx XmlWriterTraceListener不是线程安全的。(我知道Microsoft. visualbasic . logging . filelogtracelistener是,但我认为XmlWriterTraceListener格式使用Microsoft服务跟踪查看器更具可读性)。
然而,我"仅"将其用于具有UI线程和最多2个BackgroundWorkers的桌面应用程序,同时使用XmlWriterTraceListener作为源侦听器。在这种情况下,考虑到性能影响,非线程安全有多"相关"?跟踪消息的写入相对较少,即不是每秒。
编辑:UI线程和后台工作线程使用不同的tracesource(各自创建自己的tracesource)。TraceListener(目前是FileLogTraceListener,因为我不确定线程安全性)是App类中的静态公共属性。我将它添加到拥有TraceSource的类的构造函数中的TraceSource中。
Trace
类有一个属性,UseGlobalLock,如果底层侦听器报告它们不是线程安全的,它应该是true
。
换句话说,如果您使用的跟踪侦听器不是线程安全的Debug
或Trace
类,那么这些类(Trace
/Debug
)将确保以线程安全的方式处理底层侦听器。
换句话说,您的问题是丢失的线程安全性与跟踪侦听器的相关性如何,那么答案是不是非常。从性能的角度来看,这可能是相关的,如果您创建了一个侦听器,那么通过使侦听器线程安全可能会获得一些较小的性能,如果这可以用一种不同的方式来处理,而不仅仅是在它周围使用全局锁。
如果您不确定,您可以强制将此属性设置为true
,文档中有一个示例来说明如何在Trace中这样做。UseGlobalLock属性:
<configuration>
<system.diagnostics>
<trace useGlobalLock="false" />
</system.diagnostics>
</configuration>
注意,如果您将跟踪侦听器对象与Trace
类以外的对象一起使用,则此答案不适用。
请注意,Debug
类使用与Trace
类相同的底层框架,但没有该属性。
Debug
和Trace
的当前实现是它们都包装了一个内部静态类,因此如果您添加一个调试侦听器,它将被添加到跟踪中,反之亦然。因此,属性Trace.UseGlobalLock
也适用于Debug.WriteXYZ
。