如何“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中。

如何“relevant"是xmlwritertracellistener的非线程安全性

Trace类有一个属性,UseGlobalLock,如果底层侦听器报告它们不是线程安全的,它应该是true

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

换句话说,您的问题是丢失的线程安全性与跟踪侦听器的相关性如何,那么答案是不是非常。从性能的角度来看,这可能是相关的,如果您创建了一个侦听器,那么通过使侦听器线程安全可能会获得一些较小的性能,如果这可以用一种不同的方式来处理,而不仅仅是在它周围使用全局锁。

如果您不确定,您可以强制将此属性设置为true,文档中有一个示例来说明如何在Trace中这样做。UseGlobalLock属性:

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

注意,如果您将跟踪侦听器对象与Trace类以外的对象一起使用,则此答案不适用。

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

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

相关文章:
  • 没有找到相关文章