すべて静的メソッドです。多数のオーバーロードがありますが、大別すると3種類です。
メソッド | 機能 |
---|---|
Invoke(Action[]) | 指定の操作を、並列に実行できる |
For(Int32, Int32, Action<Int32>) | forを、並列に実行できる |
ForEach<TSource>(IEnumerable<TSource>, Action<TSource>) | foreachを、並列に実行できる |
.NET 8以降ならば、Taskを返すForAsync()とForEachAsync()もあります。
メソッド | |
---|---|
ForAsync<T>(T, T, Func<T,CancellationToken,ValueTask>) | |
ForEachAsync<TSource>(IEnumerable<TSource>, Func<TSource,CancellationToken,ValueTask>) |
指定のアクションを、場合によっては並列で実行するように指示できます。
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);
ParallelOptionsを渡すことで、同時実行数の制限や、アクションのキャンセルをできるようになります。
public static void Invoke( System.Threading.Tasks.ParallelOptions parallelOptions, params Action[] actions );
同時実行数のParallelOptions.MaxDegreeOfParallelismを指定しないときは-1となり、Environment.ProcessorCountの数となります。Remarks - ParallelOptions.MaxDegreeOfParallelism Property (System.Threading.Tasks) | Microsoft Learn
くり返しを並列に実行される可能性がある、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と出力される
ParallelOptionsを渡すことで、同時実行数の制限や、アクションのキャンセルをできるようになります。
public static System.Threading.Tasks.ParallelLoopResult For( int fromInclusive, int toExclusive, System.Threading.Tasks.ParallelOptions parallelOptions, Action<int> body );
あるアクションの状況によって、他のアクションを終了させる必要があるならば、ParallelLoopStateでやり取りします。
public static System.Threading.Tasks.ParallelLoopResult For( int fromInclusive, int toExclusive, Action<int,System.Threading.Tasks.ParallelLoopState> body );
並列で実行される可能性のある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