2012-10-09 12 views
2

我是新來的.net跟蹤。TraceSource.Trace方法是否阻塞調用線程,直到它被所有監聽器處理?

我的應用程序中有近10到15個跟蹤源,共享偵聽程序列表中有一個文本文件偵聽器和sql server偵聽器。我的問題是如果我打電話

traceSource.TraceInformation("Sample information") 

然後調用線程將被阻止,直到它被文本文件偵聽器和sql server偵聽器處理/跟蹤。或者TraceSource在內部包含任何用於日誌記錄的隊列,以便調用線程將立即釋放並且記錄將在後臺線程中完成。

基本上我不希望調用線程被阻塞,直到它被所有的跟蹤監聽器記錄。如果我想要這樣實現,那麼我應該去自定義偵聽器嗎?

回答

0

您的跟蹤僅作爲多線程安全的聽衆。如果許多線程試圖通過跟蹤寫入同一個文件,則可能會出現一些爭用,如果當前的文件已經打開,某些偵聽器將寫入另一個日誌文件。我從編寫控制檯跟蹤監聽器的經驗中知道,有時文本會交錯,因爲兩個線程試圖同時寫入控制檯。這意味着在System.Diagnostics框架代碼中沒有任何內容會強制阻止。

要測試一個緩慢的偵聽器塊,您可以通過實現一個自定義列表器來確定這個實驗,所以我建議您使用this base class,這樣您實際上只需要重寫至多兩個方法來編寫自定義偵聽器。添加一個Thread.Sleep(6000)並查看是否所有線程都被阻塞。

如果他們這樣做,您可能需要考慮將您的跟蹤調用放入某種即忘即用調用,可能是Task.Run,​​Task.StartNew或新的Thread/Start。但是,我懷疑創建新線程的開銷可能會使性能比阻塞幾毫秒更差。 Here is one related question