.NET 提供數種在平行程序設計中很有用的類型,包括一組並行集合類別、輕量型同步處理基本類型,以及延遲初始化的類型。 您可以使用這些類型搭配任何多執行緒應用程式代碼,包括 Task Parallel Library 和 PLINQ。
並發集合類別
命名空間中的 System.Collections.Concurrent 集合類別提供安全線程的新增和移除作業,以避免儘可能鎖定,並在需要鎖定時使用精細鎖定。 並行集合類別不需要使用者程式碼在存取項目時進行任何鎖定。 在多個執行緒從集合中新增和移除項目的情況下,並行集合類別可以顯著提升像 System.Collections.ArrayList 和 System.Collections.Generic.List<T> 等(使用用戶實作的鎖定)的類型的效能。
下表列出並行集合類別:
| 類型 | 說明 |
|---|---|
| System.Collections.Concurrent.BlockingCollection<T> | 提供封鎖和界限功能以供實作 System.Collections.Concurrent.IProducerConsumerCollection<T> 的執行緒安全集合使用。 如果沒有任何可用位置,或集合已滿,則產生者線程會封鎖。 如果集合是空的,取用者線程會封鎖。 此類型也支持取用者和生產者的非封鎖存取。 BlockingCollection<T> 可用來做為基類或支援存放區,為支援 IEnumerable<T>的任何集合類別提供封鎖和系結。 |
| System.Collections.Concurrent.ConcurrentBag<T> | 提供具擴展性新增和取得操作的執行緒安全容器實作。 |
| System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> | 並行且可調整的字典類型。 |
| System.Collections.Concurrent.ConcurrentQueue<T> | 並行且可調整的 FIFO 佇列。 |
| System.Collections.Concurrent.ConcurrentStack<T> | 並行且可調整的 LIFO 堆疊。 |
如需詳細資訊,請參閱 Thread-Safe 集合。
同步處理基本類型
命名空間中的 System.Threading 同步處理基本類型可藉由避免在舊版多線程程序代碼中找到的昂貴鎖定機制,來啟用精細的並行存取和更快速的效能。
下表列出同步處理類型:
| 類型 | 說明 |
|---|---|
| System.Threading.Barrier | 讓多個線程可以平行運行演算法,藉由提供一個點讓每個任務發出抵達訊號,然後在所有或部分任務到達之前封鎖。 如需詳細資訊,請參閱 屏障。 |
| System.Threading.CountdownEvent | 藉由提供簡單的會合機制,簡化分叉和合併情境。 如需詳細資訊,請參閱 CountdownEvent。 |
| System.Threading.ManualResetEventSlim | 與類似的 System.Threading.ManualResetEvent同步處理基本類型。 ManualResetEventSlim 較輕量,但只能用於進程內部通訊。 |
| System.Threading.SemaphoreSlim | 同步處理基本類型,可限制可同時存取資源或資源集區的線程數目。 如需詳細資訊,請參閱 Semaphore 和 SemaphoreSlim。 |
| System.Threading.SpinLock | 互斥鎖定基本類型,導致嘗試取得鎖定的線程在迴圈中等待,或 自旋一段時間,再讓渡其量子。 在預期鎖定等候時間較短的案例中, SpinLock 提供比其他類型的鎖定更好的效能。 如需詳細資訊,請參閱 SpinLock。 |
| System.Threading.SpinWait | 小型輕量化類型,將在指定時間內旋轉,並在超過旋轉次數時,最終將線程置於等候狀態。 如需詳細資訊,請參閱 SpinWait。 |
如需詳細資訊,請參閱:
延遲初始化類別
使用延遲初始化時,物件的記憶體僅在需要時才會配置。 延遲初始化可以藉由將物件配置平均分散到程式的存留期,來改善效能。 您可以透過包裝類型 Lazy<T> 來啟用任何自訂類型的延遲初始化。
下表列出延遲初始化類型:
| 類型 | 說明 |
|---|---|
| System.Lazy<T> | 提供輕量型、線程安全的延遲初始化。 |
| System.Threading.ThreadLocal<T> | 在每個執行緒上提供惰性初始化的值,每個執行緒都會惰性地呼叫初始化函數。 |
| System.Threading.LazyInitializer | 提供靜態方法,以避免需要配置專用延遲初始化實例。 相反地,它們會使用參考來確保目標在存取時已初始化。 |
如需詳細資訊,請參閱 延遲初始化。
匯總例外狀況
System.AggregateException此類型可用來擷取在個別線程上同時擲回的多個例外狀況,並將它們以單一例外狀況的形式傳回聯結線程。 System.Threading.Tasks.Task 和 System.Threading.Tasks.Parallel 類型以及 PLINQ 會廣泛使用 AggregateException 來達成此目的。 如需詳細資訊,請參閱 例外狀況處理 和 如何:處理PLINQ查詢中的例外狀況。