gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:27:31 30 4
gpt4 key购买 nike

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

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com