Parallelクラス

メソッド

すべて静的メソッドです。多数のオーバーロードがありますが、大別すると3種類です。

メソッド 機能
Invoke(Action[]) 指定の操作を、並列に実行できる
For(Int32, Int32, Action<Int32>) forを、並列に実行できる
ForEach<TSource>(IEnumerable<TSource>, Action<TSource>) foreachを、並列に実行できる

Invoke()

指定のアクションを、場合によっては並列で実行するように指示できます。

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()

くり返しを並列に実行される可能性がある、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と出力される

ForEach<TSource>()

並列で実行される可能性のある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
Microsoft Learnから検索