.net - TraceSource.Trace 方法是否会阻塞调用线程,直到它被所有监听器处理为止?

标签 .net multithreading trace tracelistener

我是 .net 跟踪的新手。

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

 traceSource.TraceInformation("Sample information")

然后调用线程将被阻塞,直到它被文本文件监听器和 sql server 监听器处理/跟踪。或者 TraceSource 内部包含任何用于日志记录的队列,以便立即释放调用线程并在后台线程中进行日志记录。

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

最佳答案

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

要测试慢速监听器 block ,您可以通过实现自定义监听器凭经验确定,我推荐 this base class所以你真的只需要重写最多两个方法来编写自定义监听器。添加一个 Thread.Sleep(6000) 并查看是否所有线程都阻塞。

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

关于.net - TraceSource.Trace 方法是否会阻塞调用线程,直到它被所有监听器处理为止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12799158/

相关文章:

c# - Entity Framework Code First - 更改表名

linux - Firefox、Linux 中的 Flash 跟踪输出

linux - blktrace 中的同步 I/O

java - 在跟踪此程序时,我可以使用哪种图表方法来保持一切井井有条?

c# - 将字符串 "1"或 "0"转换为 bool true 或 false

.net - IfxConnection 和线程可以相处吗?

C# Lock 语法 - 2 个问题

c# - 为什么跨线程以这种方式工作?

c++ - 一个简单的非锁定读取并发映射的算法?

Python:暂停函数但不是整个程序