【问题标题】:Under what circumstances should an Async method support cancellationAsync 方法在什么情况下应该支持取消
【发布时间】:2014-12-18 12:42:50
【问题描述】:

我目前正在构建现有 API 的启用异步的版本,并且我正在努力寻找有关何时支持取消的好主意的任何指导。 BCL 中的一些异步方法没有接受CancellationToken 的重载,我发现这个MSDN article 声明了

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

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

我倾向于以下条件:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 那么如果我的异步方法调用了其他 3 个异步方法,而其中只有 2 个支持取消,你不认为我的方法应该也支持吗?
    • 我的意思是,如果这三个都可以,那么您的当然应该。如果只有 2 个,那么答案就不那么清楚了;你可以把它放进去,但要做好记录。我并不是说您不应该,只是要注意,在任意时间段内,您的取消都不会产生任何影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多