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

.net TraceSource.Trace方法是否会阻止调用线程,直到它被所有侦听器处理?,.net,multithreading,trace,tracelistener,.net,Multithreading,Trace,Tracelistener,我不熟悉.net跟踪 我的应用程序中有将近10到15个跟踪源,共享侦听器列表中有一个文本文件侦听器和sql server侦听器。我的问题是如果我打电话 traceSource.TraceInformation("Sample information") 然后,调用线程将被阻止,直到文本文件侦听器和sql server侦听器处理/跟踪它为止。或者TraceSource内部包含任何用于日志记录的队列,因此调用线程将立即释放,日志记录将在后台线程中完成 基本上我不希望调用线程被阻塞,直到它被所有跟

我不熟悉.net跟踪

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

 traceSource.TraceInformation("Sample information")
然后,调用线程将被阻止,直到文本文件侦听器和sql server侦听器处理/跟踪它为止。或者TraceSource内部包含任何用于日志记录的队列,因此调用线程将立即释放,日志记录将在后台线程中完成


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

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

要测试慢速侦听器块,您可以通过实现自定义listner来根据经验确定,我建议您只需重写最多两个方法即可编写自定义侦听器。添加一个Thread.Sleep(6000)并查看是否所有线程都阻塞

如果他们这样做,你可能会考虑把你的跟踪调用放在某种程度上,忘记调用,也许任务,运行,任务。启动新的或新的线程/启动。但是,我怀疑创建新线程的开销可能会使性能比阻塞几毫秒更差