すべて静的メソッドです。多数のオーバーロードがありますが、大別すると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