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

时间:2012-10-09 11:34:13

标签: .net multithreading tracing tracelistener

我是.net追踪的新手。

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

 traceSource.TraceInformation("Sample information")

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

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

1 个答案:

答案 0 :(得分:0)

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

要测试缓慢的侦听器块,您可以通过实现自定义列表器来确定,我建议使用this base class,因此您实际上只需要覆盖最多两种方法来编写自定义侦听器。添加一个Thread.Sleep(6000)并查看是否所有线程都阻塞。

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