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

标签 c# asp.net multithreading logging trace

我发现 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/

相关文章:

c# - Resharper:无法在 VS2010 SP1 中解析符号 'Eval'

c# - 使用 UI 按钮移动游戏对象

c# - 设置构建顺序而不使用项目引用

c# - 基于属性的路由 VS 基于约定的路由 - ASP.net Core RESTful API 的最佳实践

c# - ASP C# | MessageBox 一直显示

asp.net - ASP.Net MVC 2-需要向Asp.Net MVC 2中的强类型Html.Textbox帮助程序添加默认属性

c - For 循环的索引作为 Pthread 中的参数

objective-c - 为什么 NSOperation 在不执行任何操作时使用 100% CPU 周期?

java - Tomcat Java 错误

c# - 使用其 setter 捕获属性更改