次の方法で共有


データ並列化 (タスク並列ライブラリ)

データ並列処理 とは、ソース コレクションまたは配列内の要素に対して同じ操作が同時に (つまり並列で) 実行されるシナリオを指します。 データ並列操作では、複数のスレッドが異なるセグメントで同時に動作できるように、ソース コレクションがパーティション分割されます。

タスク並列ライブラリ (TPL) は、 System.Threading.Tasks.Parallel クラスを介したデータ並列処理をサポートします。 このクラスは、for ループと foreach ループのメソッドベースの並列実装を提供します (Visual Basic ではForFor Each)。 シーケンシャル ループを記述するのと同じように、 Parallel.For または Parallel.ForEach ループのループ ロジックを記述します。 スレッドまたはキューの作業項目を作成する必要はありません。 基本ループでは、ロックを取る必要はありません。 TPL は、すべての低レベルの作業を自動的に処理します。 Parallel.ForParallel.ForEachの使用方法の詳細については、「並列プログラミングのパターン: .NET Framework 4 での並列パターンの理解と適用」をダウンロードしてください。 次のコード例は、単純な foreach ループとその並列ループを示しています。

このドキュメントでは、ラムダ式を使用して TPL でデリゲートを定義します。 C# または Visual Basic のラムダ式に慣れていない場合は、PLINQ と TPL のラムダ式のを参照してください。

// 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 はデータ ソースをパーティション分割して、ループが複数の部分で同時に動作できるようにします。 バックグラウンドで、タスク スケジューラは、システム リソースとワークロードに基づいてタスクをパーティション分割します。 可能であれば、ワークロードが不均衡になった場合、スケジューラは複数のスレッドとプロセッサ間で作業を再配布します。

独自のカスタム パーティショナーまたはスケジューラを指定することもできます。 詳細については、「PLINQ および TPL およびタスク スケジューラのカスタム パーティショナー」を参照してください。

Parallel.ForメソッドとParallel.ForEach メソッドには、ループの実行を停止または中断したり、他のスレッドのループの状態を監視したり、スレッド ローカル状態を維持したり、スレッド ローカル オブジェクトを最終処理したり、コンカレンシーの程度を制御したりできるオーバーロードがいくつかあります。 この機能を有効にするヘルパー型には、 ParallelLoopStateParallelOptionsParallelLoopResultCancellationToken、および CancellationTokenSourceが含まれます。

詳細については、「 並列プログラミングのパターン: .NET Framework 4 での並列パターンの理解と適用」を参照してください。

PLINQ では、宣言型またはクエリに似た構文を使用したデータ並列処理がサポートされています。 詳細については、「 Parallel LINQ (PLINQ)」を参照してください。

タイトル 説明
方法: 単純な Parallel.For ループを記述する 任意の配列またはインデックス可能なForソース コレクションに対してIEnumerable<T> ループを記述する方法について説明します。
方法: 単純な Parallel.ForEach ループを記述する 任意のForEach ソース コレクションに対してIEnumerable<T> ループを記述する方法について説明します。
方法: Parallel.For ループを停止または中断する すべてのスレッドにアクションが通知されるように、並列ループを停止または中断する方法について説明します。
方法: Thread-Local 変数を使用して Parallel.For ループを記述する 各スレッドが他のスレッドに表示されないプライベート変数を保持する For ループを記述する方法と、ループが完了したときにすべてのスレッドからの結果を同期する方法について説明します。
方法: Partition-Local 変数を使用して Parallel.ForEach ループを記述する 各スレッドが他のスレッドに表示されないプライベート変数を保持する ForEach ループを記述する方法と、ループが完了したときにすべてのスレッドからの結果を同期する方法について説明します。
方法: Parallel.For ループまたは ForEach ループをキャンセルする を使用して並列ループを取り消す方法について説明します。 System.Threading.CancellationToken
方法: 小規模なループの処理速度を向上させる ループ本体が非常に小さい場合に実行を高速化する 1 つの方法について説明します。
タスク並列ライブラリ (TPL) タスク並列ライブラリの概要について説明します。
並列プログラミング .NET Framework での並列プログラミングについて説明します。

こちらも参照ください