在什么情况下Async方法应该支持取消

时间:2014-10-22 22:16:14

标签: c# .net task-parallel-library async-await cancellation

我目前正在构建现有API的异步启用版本,我很难找到关于何时支持取消的好主意的任何指导。 BCL中的一些Async方法没有接受CancellationToken的重载,我发现这个MSDN article表示

  

所有异步方法都不一定支持取消

那么,有什么条件可以通过CancellationToken支持取消?

我倾向于以下条件:

  • 任何等待的方法也支持取消
  • 任何等待的方法执行时间可能超过n ms
  • 方法实现具有一个或多个逻辑出口点(例如,没有提前退出的副作用)

那些合理的条件吗?还有其他人吗?

1 个答案:

答案 0 :(得分:6)

这只是我的意见,但我会说,如果你所调用的async方法所有支持取消,那么你应该这样做。同样,如果您要通过自然异步操作创建await能力API,请尽力支持取消(例如,通过CancellationToken.Register)。

我还要说任何(同步)CPU绑定方法可能会花费很长时间,应该定期观察取消令牌(CancellationToken.ThrowIfCancellationRequested)。 “长时间”是相对的,但作为一个粗略的指导,我会说超过半秒(在较旧的硬件上,而不是我们的8核开发机器上)。

在任何其他情况下,您谈论的是一种不太有用的取消形式 - 具体而言,取消可能需要任意时间才能生效。例如,如果某些async方法支持它,但其他方法不支持。我不确定在这种情况下取​​消令牌参数会有多大用处;你可能想把它放进去,但一定要记录它的局限性。