適用於平行程式設計的資料結構

.NET 提供數個適用於平行程式設計的型別,包括一系列並行集合型別、輕量型同步處理原始物件,以及適用於延遲初始設定的型別。 您可以搭配任何多執行緒應用程式程式碼使用這些類型,其中包括工作平行程式庫和 PLINQ。

並行集合類別

System.Collections.Concurrent 命名空間中的集合類別能提供安全執行緒新增和移除作業,以盡量避免鎖定情況,並在需要鎖定時使用細部鎖定。 並行集合類別不需要使用者程式碼在存取項目時採用任何鎖定。 並行集合類別可在多執行緒針對集合新增和移除項目的案例中,大幅提升 System.Collections.ArrayListSystem.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 堆疊。

如需詳細資訊,請參閱安全執行緒集合

同步處理原始物件

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.TaskSystem.Threading.Tasks.Parallel 類型,以及 PLINQ 都會針對此目的廣泛使用 AggregateException。 如需詳細資訊,請參閱例外狀況處理如何:處理 PLINQ 查詢中的例外狀況

另請參閱