根据 http://msdn.microsoft.com/en-us/library/ms733025.aspx XmlWriterTraceListener 不是线程安全的。 (我知道 Microsoft.VisualBasic.Logging.FileLogTraceListener 是,但我认为 XmlWriterTraceListener 格式使用 Microsoft Service Trace Viewer 更具可读性)。
但是,我“仅”将它用于具有 UI 线程的桌面应用程序和最多 2 个同时使用 XmlWriterTraceListener 作为 Source 监听器的 BackgroundWorker。
考虑到性能影响,在这种情况下,非线程安全有多“相关”?
跟踪消息写得比较稀疏,即不是每秒。
编辑: UI 线程和后台工作人员使用不同的 TraceSources(各自创建自己的)。 TraceListener(目前是 FileLogTraceListener,因为我不确定线程安全性)是 App 类中的静态公共(public)属性。我将它添加到拥有 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.UseGlobalLock
也适用于 Debug.WriteXYZ
。
关于c# - "relevant"是XmlWriterTraceListener的非线程安全性如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25037510/