我有以下代码:
CancellationTokenSource cts = new CancellationTokenSource();
ParallelOptions po = new ParallelOptions();
po.CancellationToken = cts.Token;
Task.Factory.StartNew(() =>
{
if (Console.ReadKey().KeyChar == 'c')
cts.Cancel();
Console.WriteLine("press any key to exit");
});
Parallel.ForEach(list, po, (algo) =>
{
algo.Compute(); // this compute lasts 1 minute
Console.WriteLine("this job is finished");
po.CancellationToken.ThrowIfCancellationRequested();
});
list
包含的元素很少。当我按“c”时,所有
Compute
方法都已经启动。当我按 'c' 时,不会抛出异常。每个
Compute
方法都会继续执行,直到正常结束。当我按“c”时,我想停止/终止所有剩余的
Compute
方法。 最佳答案
取消不是这样工作的。这不像调用 Thread.Abort()
来立即终止线程。
对于序列中的每个元素,您的代码执行以下操作:
Compute()
方法 OperationCanceledException
。 为了取消某些任务,您需要将
CancellationToken
传递给被调用的方法。也许,值得将长时间运行的计算组织为一个循环,并检查是否在每一步都请求取消以尽快停止它。
例如,在您的
Compute()
方法中,您可以执行如下检查:private void Compute(CancellationToken ct)
{
while (true)
{
ComputeNextStep();
ct.ThrowIfCancellationRequested();
}
}
关于c# - ThrowIfCancellationRequested 似乎没有抛出任何异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22530757/