すべて静的メソッドです。多数のオーバーロードがありますが、大別すると3種類です。
メソッド | 機能 |
---|---|
Invoke(Action[]) | 指定の操作を、並列に実行できる |
For(Int32, Int32, Action<Int32>) | forを、並列に実行できる |
ForEach<TSource>(IEnumerable<TSource>, Action<TSource>) | foreachを、並列に実行できる |
指定のアクションを、場合によっては並列で実行するように指示できます。
public static void Invoke (params Action[] actions);Invoke(Action[]) - Parallel.Invoke メソッド (System.Threading.Tasks) | Microsoft Learn
実行される順序や、並列で実行される保証はありません。またすべての操作が完了するまで、制御を戻しません。
Action action1 = delegate {}; Action action2 = delegate {}; Parallel.Invoke(action1, action2);
くり返しを並列に実行される可能性がある、forループを実行できます。
public static System.Threading.Tasks.ParallelLoopResult For ( int fromInclusive, // 開始インデックス int toExclusive, // 終了インデックス Action<int> body // イテレーションごとに1回呼び出されるデリゲート );For(Int32, Int32, Action<Int32>) - Parallel.For メソッド (System.Threading.Tasks) | Microsoft Learn
Parallel.For(0, 5, (a) =>
{
Console.Write(a);
});
// 02341や01342と出力される
並列で実行される可能性のあるIEnumerableを、foreach操作で実行できます。
public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource> ( System.Collections.Generic.IEnumerable<TSource> source, Action<TSource> body );ForEach<TSource>(IEnumerable<TSource>, Action<TSource>) - Parallel.ForEach メソッド (System.Threading.Tasks) | Microsoft Learn
戻り値のParallelLoopResultでループが最後まで実行されたかどうか、されなかったならばその反復処理のインデックスを得られます。
同等の操作はForAll<TSource>()でも可能です。
IEnumerable<int> source = Enumerable.Range(0, 10); // ForEach() ParallelLoopResult result = Parallel.ForEach(source, (item) => { Console.Write(item); }); // ForAll() source.AsParallel().ForAll((item) => { Console.Write(item); }); // foreach foreach (int item in source) { Console.Write(item); }.net - Parallel.ForEach vs AsParallel().ForAll - Stack Overflow
ForEach()の呼び出し時にCancellationTokenを設定したParallelOptions.CancellationTokenを渡すことで、ループをキャンセルできるようになります。
IEnumerable<int> source = Enumerable.Range(0, 100); CancellationTokenSource tokenSource = new CancellationTokenSource(); ParallelOptions options = new ParallelOptions() { CancellationToken = tokenSource.Token }; Parallel.Invoke( delegate { ParallelLoopResult result = new ParallelLoopResult(); try { result = Parallel.ForEach(source, options, (item) => { Console.Write(item); }); } catch (OperationCanceledException e) // キャンセルされた { bool comp = result.IsCompleted; // false } }, delegate { tokenSource.Cancel(); // キャンセルを要求する });方法: Parallel.For または ForEach ループを取り消す - .NET | Microsoft Learn