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

本文关键字:支持 取消 在什么 情况下 异步方法 | 更新日期: 2023-09-27 18:27:26

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

并非所有异步方法都必须支持取消

那么,什么条件才值得支持通过CancellationToken取消呢?

我倾向于以下条件:

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

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

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

这只是我的观点,但我想说,如果您调用的async方法都支持取消,那么您的方法应该支持。同样,如果您正在通过自然异步操作创建一个支持await的API,那么请尽最大努力支持取消(例如,通过CancellationToken.Register)。

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

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