資料平行處理原則 (工作平行程式庫)

「資料平行處理原則」是指在來源集合或陣列中的元素上,同時 (也就是平行) 執行相同作業的情節。 在資料平行作業中,會將來源集合分割,讓多個執行緒可以同時在不同區段上操作。

工作平行程式庫 (TPL) 會透過 System.Threading.Tasks.Parallel 類別支援資料平行處理原則。 這個類別針對 forforeach 迴圈 (在 Visual Basic 中為 ForFor Each),提供以方法為基礎的平行實作。 針對 Parallel.ForParallel.ForEach 迴圈撰寫迴圈邏輯的方式,和撰寫循序迴圈很像。 您不必建立執行緒或佇列工作項目。 在基本迴圈中,您不必採用鎖定。 TPL 會為您處理所有低階工作。 如需有關 Parallel.ForParallel.ForEach 之用途的深入資訊,請下載這份文件:平行程式設計模式:了解及套用 .NET Framework 4 中的平行模式 \(英文\)。 下列程式碼範例顯示簡單的 foreach 迴圈及其平行對等項目。

注意

本文件使用 Lambda 運算式來定義 TPL 中的委派。 如果您不熟悉 C# 或 Visual Basic 中的 Lambda 運算式,請參閱 PLINQ 和 TPL 中的 Lambda 運算式

// Sequential version
foreach (var item in sourceCollection)
{
    Process(item);
}

// Parallel equivalent
Parallel.ForEach(sourceCollection, item => Process(item));
' Sequential version        
For Each item In sourceCollection
    Process(item)
Next

' Parallel equivalent
Parallel.ForEach(sourceCollection, Sub(item) Process(item))

當平行迴圈執行時,TPL 會分割資料來源,讓迴圈可以同時在多個部分上操作。 在幕後,工作排程器會依據系統資源和工作負載來分割工作。 如果工作負載變得不平衡,在可能的情況下,排程器會在多個執行緒與處理器之間轉散發工作。

注意

您也可以提供您自己的自訂 Partitioner 或排程器。 如需詳細資訊,請參閱 PLINQ 和 TPL 的自訂 Partitioner工作排程器

Parallel.ForParallel.ForEach 方法都有數個多載,可讓您停止或中斷迴圈執行、監視其他執行緒上的迴圈狀態、維護執行緒區域狀態、完成執行緒區域物件、控制並行程度等等。 啟用這個功能的 Helper 類型包括 ParallelLoopStateParallelOptionsParallelLoopResultCancellationTokenCancellationTokenSource

如需詳細資訊,請參閱平行程式設計模式:了解及套用使用 .NET Framework 4 的平行模式

PLINQ 可支援使用宣告式 (或類似查詢) 語法的資料平行處理原則。 如需詳細資訊,請參閱 Parallel LINQ (PLINQ)

標題 描述
操作說明:撰寫簡單的 Parallel.For 迴圈 說明如何透過任何陣列或可建立索引的 IEnumerable<T> 來源集合,撰寫 For 迴圈。
操作說明:撰寫簡單的 Parallel.ForEach 迴圈 說明如何透過任何 IEnumerable<T> 來源集合,撰寫 ForEach 迴圈。
如何:停止或中斷 Parallel.For 迴圈 描述如何停止或中斷平行迴圈,讓所有執行緒都能收到動作的通知。
如何:撰寫含有執行緒區域變數的 Parallel.For 迴圈 說明如何撰寫 For 迴圈 (其中每個執行緒各維護一個任何其他執行緒都看不到的私用變數),以及當迴圈完成時,如何同步處理所有執行緒的結果。
如何:撰寫含有 Partition-Local 變數的 Parallel.ForEach 迴圈 說明如何撰寫 ForEach 迴圈 (其中每個執行緒各維護一個任何其他執行緒都看不到的私用變數),以及當迴圈完成時,如何同步處理所有執行緒的結果。
如何:取消 Parallel.For 或 ForEach 迴圈 說明如何使用 System.Threading.CancellationToken 來取消平行迴圈
如何:加速小型迴圈主體 說明當迴圈主體非常小時,用來加速執行的一種方法。
工作平行程式庫 (TPL) 提供工作平行程式庫的概觀。
平行程式設計 介紹如何以 .NET Framework 進行平行程式設計。

另請參閱