【问题标题】:Does TraceSource.Trace methods block the calling thread until it is processed by all listeners?TraceSource.Trace 方法是否会阻塞调用线程,直到它被所有侦听器处理?
【发布时间】:2012-10-09 11:34:13
【问题描述】:

我是 .net 跟踪的新手。

我的应用程序中有近 10 到 15 个跟踪源,共享侦听器列表中有一个文本文件侦听器和 sql 服务器侦听器。我的问题是如果我打电话

 traceSource.TraceInformation("Sample information")

然后调用线程将被阻塞,直到它被文本文件侦听器和 sql server 侦听器处理/跟踪。或者 TraceSource 内部包含任何日志队列,这样调用线程将立即释放,日志将在后台线程中完成。

基本上我不希望调用线程被阻塞,直到它被所有跟踪侦听器记录。如果我想这样实现,那么我应该使用自定义侦听器吗?

【问题讨论】:

    标签: .net multithreading trace tracelistener


    【解决方案1】:

    您的跟踪仅与您的侦听器一样多线程安全。如果许多线程试图通过跟踪写入同一个文件,可能会发生争用,如果当前日志文件已经打开,一些侦听器将写入另一个日志文件。我从写入控制台跟踪侦听器的经验中知道,有时文本会在两个线程尝试同时写入控制台时交错。这对我来说意味着 System.Diagnostics 框架代码中的任何内容都不会强制阻塞。

    要测试慢速侦听器块,您可以通过实现自定义侦听器凭经验确定,我推荐this base class,因此您实际上最多只需要重写两个方法即可编写自定义侦听器。添加一个 Thread.Sleep(6000) 看看是否所有线程都阻塞了。

    如果是这样,您可能需要考虑将跟踪调用放入某种即发即弃的调用中,可能是 Task.Run、Task.StartNew 或新的 Thread/Start。但是,我怀疑创建新线程的开销可能会使性能比阻塞几毫秒更差。 Here is one related question.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 2022-06-28
      相关资源
      最近更新 更多