Parallel.Invokeを使用すると、cancelationTokenを含むParallelOptionsを渡すことができます。呼び出しでそのトークンを使用して、終了が発生するかどうかを判断できますか?アクション内からCancellationTokenSourceへの参照を使用する必要がありますか?parallel.invokeキャンセルトークン
CancellationTokenSource cts = new CancellationTokenSource();
ParallelOptions po = new ParallelOptions();
po.CancellationToken = cts.Token;
Parallel.Invoke(po,
new Action(() => { if (cts.IsCancellationRequested) return; Console.WriteLine("Invoked Method 1"); }),
new Action(() => { if (cts.IsCancellationRequested) return; Console.WriteLine("Invoked Method 2"); }),
new Action(() => { if (cts.IsCancellationRequested) return; Console.WriteLine("Invoked Method 3"); cts.Cancel(); }),
new Action(() => { if (cts.IsCancellationRequested) return; Console.WriteLine("Invoked Method 4"); }),
new Action(() => { if (cts.IsCancellationRequested) return; Console.WriteLine("Invoked Method 5"); })
);
更新:キャンセルが遅すぎました。私は呼び出されたメソッドの外でそれをやっていました。
注:キャンセルがすぐに行われた場合は、Parallel.Invokeがスローされますが、それ以外の場合は、スキップされていないメソッドが確実に終了します。
ジョン、私は(私の投稿の例がそれを示してdoesntのが)それをやっていたが、すべてのメソッドが完了するまで実行を継続します。 –
@DustinDavis:キャンセルを実際に確認する方法を示す必要があります。完全な例と何が起きるかは、問題の診断を容易にします。 –
私はそれを理解しました。取り消しが遅すぎた。 –