【问题标题】:Async methods that do not need cancellation不需要取消的异步方法
【发布时间】:2014-08-26 22:34:32
【问题描述】:

发现异步任务的学习取消this article

作为支持基于任务的异步编程模型的一部分 .NET Framework 4.5,我们将CancellationToken 结构添加到 .NET Framework 中大量异步 API 的签名。为了 例如,HttpClient 类公开了一个 GetAsync 方法重载, 接受取消令牌。但是,并非所有人都必须 支持取消的异步方法。例如,如果你看 HttpContent 类,LoadIntoBufferAsync 方法不公开 带有取消令牌的重载。

在签名中公开CancellationToken 的异步操作与不公开的异步操作有什么根本区别?

【问题讨论】:

    标签: .net asynchronous task-parallel-library async-await


    【解决方案1】:

    在签名中公开 CancellationToken 的异步操作与不公开的异步操作有什么根本区别?

    在其签名中公开 CancellationToken 的异步操作:

    • 可以取消

    不在其签名中公开 CancellationToken 的异步操作:

    • 无法取消;或
    • 它们可以通过其他方式取消(例如 yourAsyncObject.Dispose 很好地总结了所有内容)

    【讨论】:

    • 为什么不能取消?什么原因?
    • @UserControl 忽略“可通过其他方式取消”位,您无法取消它们的原因是......因为您无法取消它们。 await Task.Delay(9999999999);await Task.Delay(99999999, myCancellationToken)。如果没有取消令牌,您将如何取消第一个? (不要说Thread.Abort。)
    • 至于“他们为什么不支持取消”可能是 a) 懒惰 b) 他们只调用其他不支持取消的异步方法 c) 他们是同步实现的 d) 他们不'不必支持取消 e) 以上所有 f) 其他。
    • 在此评论中添加“为什么”不能取消是因为必须在操作内部检查取消令牌,并在预先指定的位置取消操作。因此,如果操作涉及循环,则应该在循环外部而不是内部取消。这意味着该方法应在循环之前或之后检查 CancellationToken。 CancellationToken 仅允许实现者在代码中的特定点退出操作,而 Thread.Abort(取消操作的非 TPL 方式)将取消当前代码执行的任何位置。
    猜你喜欢
    • 1970-01-01
    • 2018-02-23
    • 2013-07-11
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多