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

約翰,我就是這麼做的(雖然我的貼例如犯規表現出來),但所有的方法會繼續執行,直到完成。 –

+0

@DustinDavis:你需要展示你是如何檢查取消的。一個完整的例子 - 以及發生的情況 - 將使診斷問題更容易。 –

+0

我明白了。取消發生得太晚了。 –