使用Parallel.Invoke时,您可以传入包含cancelationToken的ParallelOptions。是否可以在调用中使用该令牌来确定是否应该退出?是否应该在动作中使用CancellationTokenSource?
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将抛出,但是否则inoked方法将会一直退出。
答案 0 :(得分:2)
是。例如:
CancellationToken ct = tokenSource.Token;
ParallelOptions po = new ParallelOptions { CancellationToken = ct; };
Parallel.Invoke(po
() => { Console.WriteLine(ct.IsCancellationRequested); },
// etc
);
特别是,您可以将取消令牌传递给其他可能将其传播到异步任务的方法。
答案 1 :(得分:2)
在msdn上有一个相当不错的例子。
似乎您可以查询状态并使用cancellationToken来通知调度程序。