我目前正在构建现有API的异步启用版本,我很难找到关于何时支持取消的好主意的任何指导。 BCL中的一些Async方法没有接受CancellationToken
的重载,我发现这个MSDN article表示
所有异步方法都不一定支持取消
那么,有什么条件可以通过CancellationToken
支持取消?
我倾向于以下条件:
那些合理的条件吗?还有其他人吗?
答案 0 :(得分:6)
这只是我的意见,但我会说,如果你所调用的async
方法所有支持取消,那么你应该这样做。同样,如果您要通过自然异步操作创建await
能力API,请尽力支持取消(例如,通过CancellationToken.Register
)。
我还要说任何(同步)CPU绑定方法可能会花费很长时间,应该定期观察取消令牌(CancellationToken.ThrowIfCancellationRequested
)。 “长时间”是相对的,但作为一个粗略的指导,我会说超过半秒(在较旧的硬件上,而不是我们的8核开发机器上)。
在任何其他情况下,您谈论的是一种不太有用的取消形式 - 具体而言,取消可能需要任意时间才能生效。例如,如果某些async
方法支持它,但其他方法不支持。我不确定在这种情况下取消令牌参数会有多大用处;你可能想把它放进去,但一定要记录它的局限性。