gpt4 book ai didi

c# - ThrowIfCancellationRequested 似乎没有抛出任何异常

转载 作者:太空狗 更新时间:2023-10-30 01:36:20 24 4
gpt4 key购买 nike

我有以下代码:

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();
});

列表 包含的元素很少。当我按下“c”时,所有的 Compute 方法都已经启动。

当我按下“c”时,没有抛出异常。每个 Compute 方法都会继续执行,直到正常结束。

我想在按下“c”时停止/终止所有剩余的 Compute 方法。

最佳答案

取消不是这样的。这不像调用 Thread.Abort() 来立即终止线程。

对于序列中的每个元素,您的代码会执行以下操作:

  1. 调用Compute()方法
  2. 等到它完成
  3. 写到控制台关于完成
  4. 检查是否请求了取消,如果是则抛出 OperationCanceledException

为了取消某些任务,您需要将 CancellationToken 传递给被调用的方法。
也许,值得将长时间运行的计算组织为一个循环,并检查是否在每个步骤都请求取消以便尽快停止它。

例如,在您的 Compute() 方法中,您可以执行如下检查:

private void Compute(CancellationToken ct)
{
while (true)
{
ComputeNextStep();
ct.ThrowIfCancellationRequested();
}
}

关于c# - ThrowIfCancellationRequested 似乎没有抛出任何异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22530757/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com