我想用默認的Microsoft XmlTraceListener替換爲基於文件大小限制或當前日期切換文件的監聽器。我想保留默認的XmlTraceListener文件格式,以便我可以使用ServiceTraceViewer工具打開文件。基於XmlWriterTraceListener的線程安全跟蹤監聽器
我發現了一篇文章http://www.codeproject.com/Articles/30956/A-Rolling-XmlWriterTraceListener,但是從評論看來,即使在應用了建議的修補程序之後,此偵聽器仍然存在一些不穩定性。
後來我發現微軟自己實現CircularListener http://msdn.microsoft.com/en-us/library/aa395205.aspx
我想擴展它的,但發現它有
static CircularStream m_stream = null;
,無鎖被訪問後這個變量。在閱讀http://msdn.microsoft.com/en-us/library/ms733025.aspx時,我發現即使XmlWriterTraceListener本身也不是線程安全的。 MSDN說:
因爲System.Diagnostics.XmlWriterTraceListener是不是線程安全的, 跟蹤源可完全鎖定資源輸出 痕跡時。當許多線程向配置爲 的跟蹤源輸出跟蹤以使用此偵聽器時,可能會發生資源爭用,導致 是一個重大性能問題。若要解決此問題,您應該 實現線程安全的自定義偵聽器。
所以基本上這意味着TraceListener.IsThreadSafe
財產留給false
爲XmlWriterTraceListener,所以後來每次上級跟蹤系統鎖定時TRACEDATA/TraceEvent叫,是嗎?
從圍繞該static CircularStream m_stream
和返回true
形成覆蓋IsThreadSafe
屬性增加一個鎖會有任何好處嗎?或者也許它會和XmlTraceListener中已經完成的事情一樣?
我能做些什麼來使CircularTraceListener線程安全和高效?
您是否在多線程的默認配置中嘗試過它,並確定鎖定行爲會導致問題?如果你想添加同步,你必須做更多的事情,而不僅僅是鎖定那個變量聲明。您必須鎖定每次訪問流。 – 2013-03-15 17:12:59