异步方法在什么情况下应该支持取消
本文关键字:支持 取消 在什么 情况下 异步方法 | 更新日期: 2023-09-27 18:27:26
我目前正在构建一个现有API的异步版本,我很难找到任何关于何时支持取消的指导。BCL中的一些Async方法没有接受CancellationToken
的重载,我发现了这篇MSDN文章
并非所有异步方法都必须支持取消
那么,什么条件才值得支持通过CancellationToken
取消呢?
我倾向于以下条件:
- 任何等待调用的方法也支持取消
- 任何等待的方法执行时间都可能超过n毫秒
- 方法实施有一个或多个逻辑退出点(例如,提前退出没有副作用)
这些条件合理吗?还有其他的吗?
这只是我的观点,但我想说,如果您调用的async
方法都支持取消,那么您的方法应该支持。同样,如果您正在通过自然异步操作创建一个支持await
的API,那么请尽最大努力支持取消(例如,通过CancellationToken.Register
)。
我还想说,任何可能需要"很长时间"的(同步)CPU绑定方法都应该定期观察取消令牌(CancellationToken.ThrowIfCancellationRequested
)。"长时间"是相对的,但作为一个粗略的指导原则,我会说任何超过半秒的事情(在旧硬件上,而不是我们的8核开发机器上;)。
在任何其他情况下,你谈论的是一种用处小得多的取消形式——特别是,取消可能需要任意的时间才能生效。例如,如果某些async
方法支持它,但其他方法不支持。我不确定在这种情况下取消令牌参数会有多有用;你可能想把它放进去,但一定要记录它的局限性。