一般性建議 使用多線程時要考慮以下準則

使用多線程時要考慮以下準則:

不要使用 Thread.Abort 終止其他線程。對另一個線程調用 Abort 無異於引發該線程的異常,也不知道該線程已處理到哪個位置。

不要使用 Thread.Suspend 和 Thread.Resume 來同步多個線程的活動。不要使用 Mutex、ManualResetEvent、AutoResetEvent 和 Monitor。

不要從主程序中控制輔助線程的執行(如使用事件),而應在設計程序時讓輔助線程負責等待任務,執行任務,並在完成時通知程序的其他部分。如果輔助線程不阻止,請考慮使用線程池線程。Monitor.PulseAll 在輔助線程阻止的情況下會很有用。

不要將類型用作鎖定對象。例如,避免在 C# 中使用 lock(typeof(X)) 代碼,或在 Visual Basic 中使用 SyncLock(GetType(X)) 代碼,或將 System.Threading.Monitor.Enter(System.Object) 和 Type 對象一起使用。對於給定類型,每個應用程序域只有一個 System.Type 實例。如果您鎖定的對象的類型是 public,您的代碼之外的代碼也可鎖定它,但會導致死鎖。有關其他信息,請參見可靠性最佳做法。

鎖定實例時要謹慎,例如,C# 中的 lock(this) 或 Visual Basic 中的 SyncLock(Me)。如果您的應用程序中不屬於該類型的其他代碼鎖定了該對象,則會發生死鎖。

一定要確保已進入監視器的線程始終離開該監視器,即使當線程在監視器中時發生異常也是如此。C# 的 lock 語句和 Visual Basic 的 SyncLock 語句可自動提供此行爲,它們用一個 finally 塊來確保調用 Monitor.Exit。如果無法確保調用 Exit,請考慮將您的設計更改爲使用 Mutex。Mutex 在當前擁有它的線程終止後會自動釋放。

一定要針對那些需要不同資源的任務使用多線程,避免向單個資源指定多個線程。例如,任何涉及 I/O 的任務都會從其擁有其自己的線程這一點得到好處,因爲此線程在 I/O 操作期間將阻止,從而允許其他線程執行。用戶輸入是另一種可從專用線程獲益的資源。在單處理器計算機上,涉及大量計算的任務可與用戶輸入和涉及 I/O 的任務並存,但多個計算量大的任務將相互競爭。

對於簡單的狀態更改,請考慮使用 Interlocked 類的方法,而不是 lock 語句(在 Visual Basic 中爲 SyncLock)。lock 語句是一個優秀的通用工具,但是 Interlocked 類爲必須是原子性的更新提供了更好的性能。如果沒有爭奪,它會在內部執行一個鎖定前綴。在查看代碼時,請注意類似於以下示例所示的代碼。在第一個示例中,狀態變量是遞增的:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章