我有以下代码:
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();
});
The list
含有很少的元素。
一切Compute
当我按“c”时,方法已经启动。
当我按“c”时,不会引发异常。每个Compute
方法继续执行直到其正常结束。
我想阻止/杀死所有剩下的人Compute
当我按“c”时的方法。
取消不是这样的。这不像打电话Thread.Abort()
立即终止线程。
对于序列中的每个元素,您的代码执行以下操作:
- Calls
Compute()
method
- 等待直到完成
- 向控制台写入有关完成的信息
- 检查是否请求取消并抛出
OperationCanceledException
如果它是。
为了取消某些任务,您需要通过CancellationToken
到被调用的方法。
也许,值得将长时间运行的计算组织为一个周期,并检查每个步骤是否请求取消以便尽快停止它。
例如,在你的Compute()
您可以像这样执行检查的方法:
private void Compute(CancellationToken ct)
{
while (true)
{
ComputeNextStep();
ct.ThrowIfCancellationRequested();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)