c# - "relevant"是XmlWriterTraceListener的非线程安全性如何?

标签 c# .net multithreading thread-safety trace

根据 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

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

换句话说,如果您的问题是缺少线程安全性与跟踪监听器的相关性如何,那么答案不是很。从性能的角度来看,这可能是相关的,如果您创建一个监听器,则可能会通过使监听器线程安全来获得一些小的性能,如果这可以用不同的方式处理,而不仅仅是围绕它的全局锁定。

如果您不确定可以强制此属性为 true,并且文档在此处提供了如何执行此操作的示例,Trace.UseGlobalLock Property :

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

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

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

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

关于c# - "relevant"是XmlWriterTraceListener的非线程安全性如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25037510/

相关文章:

java - 这是 Android 线程的安全使用吗?

c++ - 在同一硬件单元上创建多个线程

c# - 创建倒计时 C#

c# - 如何将 Razor 页面下拉列表中的选定值返回到 C# 变量?

c# - 在 C# 中未处理 TypeLoadException

c# - LINQ:大字符串列表

c# - 运行时编译期间的 Ambiguous Reference 错误

c# - 将数据注释应用于 MVC 中 View 模型的子属性?

c# - 当使用的字体不支持这种语言时,Label 控件如何正确显示日语字符?

mysql - MySQL最大连接数,适当关闭连接