1

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がスローされますが、それ以外の場合は、スキップされていないメソッドが確実に終了します。

答えて

1

はい。たとえば、

CancellationToken ct = tokenSource.Token; 

ParallelOptions po = new ParallelOptions { CancellationToken = ct; }; 

Parallel.Invoke(po 
    () => { Console.WriteLine(ct.IsCancellationRequested); }, 
    // etc 
); 

特にキャンセルトークンを非同期タスクに伝播する可能性のある他のメソッドに渡すことができます。

+0

ジョン、私は(私の投稿の例がそれを示してdoesntのが)それをやっていたが、すべてのメソッドが完了するまで実行を継続します。 –

+0

@DustinDavis:キャンセルを実際に確認する方法を示す必要があります。完全な例と何が起きるかは、問題の診断を容易にします。 –

+0

私はそれを理解しました。取り消しが遅すぎた。 –