【问题标题】:Cancellation Token in await methodawait 方法中的取消令牌
【发布时间】:2012-12-11 15:14:24
【问题描述】:

在任务的构造函数中放置令牌的原因有很多,这里提到: Cancellation token in Task constructor: why?

使用关键字 async / await,它是如何工作的? 例如我下面的代码:

public async Task MethodAsync(CancellationToken token)
{
  await Method01Async();
  await Method02Async();
}

虽然它是一个异步过程。我很快就使用了“Task.StartNext”或“Task.Run”或“新任务”。为了能够指定我的取消令牌,我该怎么做?

【问题讨论】:

  • 重构这些方法以获取CancellationToken
  • 如果我不(显式)创建任务,我该如何重构?
  • 如果你不能改变Method01Async来接受一个token,你能做的最好的就是在01完成后自己检查token,提前退出而不是调用02
  • Here 是一篇关于该主题的精彩文章。你想真正停止异步任务,还是在令牌被取消并停止等待时继续?您是否知道这样做的潜在陷阱?

标签: c# async-await async-ctp cancellation-token


【解决方案1】:

您不应该在async 方法中使用Task 构造函数。通常,您只想传递CancellationToken,如下所示:

public async Task MethodAsync(CancellationToken token)
{
  await Method01Async(token);
  await Method02Async(token);
}

【讨论】:

  • 如果我不能。然后总是要检查异步方法里面的token?
  • @J.Lennon:实际上,你确实得到了好处。如果您立即检查它,那么您的其余代码将无法运行。当它被取消时,从MethodAsync 返回的Task 将以取消状态完成。如果将其传递给 Task 构造函数,您将获得所有的好处。
猜你喜欢
  • 1970-01-01
  • 2022-06-16
  • 2016-10-14
  • 1970-01-01
  • 2017-06-03
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
  • 2014-07-28
相关资源
最近更新 更多