gpt4 book ai didi

c# - 如何实例化 C# TraceSources 以记录(多线程)ASP.NET 2.0 Web 应用程序(asmx ws)?

转载 作者:行者123 更新时间:2023-12-03 13:22:29 26 4
gpt4 key购买 nike

我发现 TraceSource 上的所有示例都没有解决多线程问题。我创建了一个类 (SyncService) 的新实例来服务传入的请求。当有大量事件时,有多个线程需要使用此 TraceSource 来记录事件。在考虑性能和线程安全的情况下,我应该如何使用此类进行日志记录?我有一些选择:

私有(private)静态 TraceSource _source;

静态同步服务()
{
_source = new TraceSource("mySrc");
}

如果以上线程安全是一个问题。有很多日志记录,所以我不想在任何地方都加锁来保护对 TraceEvent 方法的访问。删除两个静态关键字怎么样?当所有请求都从自己的 TraceSource 进行日志记录时,是否有很多开销?有比这两个更好的解决方案吗? msdn 声明:“这种类型的任何公共(public)静态(在 Visual Basic 中为共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。”我应该怎么想?

最佳答案

像这样定义 TraceSource 以确保您只获得一个实例:

private static readonly TraceSource _source = new TraceSource("mySrc");

这将确保在任何线程开始使用它之前创建它,因此您只能保证一个实例。

TraceSource 在 Trace.UseGlobalLock 中默认有一个全局锁。这将自动为您锁定所有跟踪监听器。如果设置为 false,如果监听器未定义为线程安全,它将锁定每个 TraceListener。

如果记录速度“慢”且跟踪量很大,跟踪可能会成为瓶颈。

为了确保最大速度,您需要使用尽可能少的跟踪监听器,确保它们是线程安全的,并设置 Trace.UseGlobalLock = false。如果您无法控制在 app.config 中添加的监听器,您应该保持全局​​锁定。

关于c# - 如何实例化 C# TraceSources 以记录(多线程)ASP.NET 2.0 Web 应用程序(asmx ws)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1901086/

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