【问题标题】:Should I pass a CancellationToken to Task.Run? [duplicate]我应该将 CancellationToken 传递给 Task.Run 吗? [复制]
【发布时间】:2021-12-14 07:09:08
【问题描述】:

关于这个例子:

return Task.Run(
   async () => {
     while (!stoppingToken.IsCancellationRequested) {
       await Task.Delay(1000);
      }
    }, stoppingToken);

我是否应该将 stopToken 传递给 Task.Run?这如何改变代码行为?

【问题讨论】:

  • 作为旁注,您可能想改为将任务标记为已取消并停止继续 docs.microsoft.com/en-us/dotnet/standard/parallel-programming/… 但这取决于您的用例。
  • 附带说明,如果您希望CancellationToken 具有停止语义(从为变量stoppingToken 选择的名称中可以明显看出),您应该处理并禁止所有OperationCanceledExceptions这可能会发生。通过将stoppingToken 作为参数添加到Task.Run,您可以多注意这一点。

标签: c# .net asynchronous task


【解决方案1】:

如果任务计划运行但尚未启动,如果在任务实际启动之前请求取消,则传递令牌将阻止任务启动。

the docs:

一个取消令牌,可用于取消尚未开始的工作。

请注意,在您的示例中,您也可以将令牌传递给 Task.Delay,以最大限度地减少响应取消请求所需的时间。

【讨论】:

    猜你喜欢
    • 2018-06-27
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 2020-03-29
    • 2019-11-22
    • 2019-06-07
    相关资源
    最近更新 更多