2009-12-15 40 views
2

msdn:「此類型的任何公共靜態(在Visual Basic中爲Shared)成員都是線程安全的,但不保證所有實例成員都是線程安全的。它只包含實例方法。多線程應用程序中的C#TraceSource類

我應該如何使用它,以便所有活動都通過TextWriterTraceListener將記錄器記錄到文本文件中。是所有線程使用(通過調用)TraceEvent方法安全的一個靜態成員。

(我在how to instantiate C# TraceSources to log (multithreaded) ASP.NET 2.0 Web application (asmx ws)?中問過這個問題,但我不能相信是否有人只是說盡管有文檔就可以)。

回答

0

當使用不是線程安全的資源(或不能保證線程安全的)是一個多線程應用程序,我將使用lock關鍵字爲

lock(_lockObject) 
{ 
    // do my non-thread-safe-operations here 
} 

文檔/實例鎖定關鍵字可以在這裏找到:

http://msdn.microsoft.com/en-us/library/c5kehkcz(VS.71).aspx

至於使用類的一個公共靜態實例的所有線程 - 這不一定是線程安全的。使用靜態實例可確保對象的狀態在線程間共享/一致,但不一定會阻止並行調用該方法。事實上,如果實例方法正在使用靜態對象中的一些通用狀態變量 - 從多個線程訪問對象可能會引入其他問題 - 競爭條件,嘗試訪問同一資源的多個線程等。靜態實例對象並不妨礙這些條件。

如果您使用的是對象的靜態實例,請在對其進行操作時將其鎖定,並且應該沒問題。

+0

是或監視器類。但mys的問題是:有一個靜態的TraceSource實例並使用它的TraceEnvent方法是否安全?請參閱http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/93696038-2255-4d7c-a53a-b0b1bcdd2fc2。 – 2009-12-15 17:23:45

+0

我明白了。我進一步闡述了我的答案。希望能幫助到你。 – 2009-12-15 17:34:52

+0

在TraceSource的情況下,'線程不安全'可能是因爲TraceListener不是線程安全的。這就是TraceInternal.UseGlobalLock的原因。我想知道的是:如果TraceListener.IsThreadSafe像TextWriterTraceListener的返回false這個全局鎖是否足夠?出於性能原因,我不想進行雙重鎖定。請參閱http://www.grimes.demon.co.uk/workshops/InstrWSThree.htm – 2009-12-15 17:47:39