【问题标题】:Async CTP - Ambient CancellationToken and IProgress异步 CTP - 环境 CancellationToken 和 IProgress
【发布时间】:2012-02-05 04:01:00
【问题描述】:

考虑到异步 CTP 通过环境 SynchronizationContext 促进隐式调度,有什么理由不让我的 CancellationTokenIProgress 也成为环境?

我目前正在通过方法传递这些,就像我传递TaskScheduler 以进行显式调度一样。但是,既然调度程序现在应该是环境的,我可能不会对拼图的其他部分遵循相同的规则吗?

【问题讨论】:

    标签: c# .net task-parallel-library async-ctp .net-4.5


    【解决方案1】:

    CancellationTokenIProgress<T> 更有可能成为这个候选者。使用IProgress<T>,您通常在不同级别有不同的T(更高级别的async 方法结合了其低级别await 调用的进度通知)。使用CancellationToken,几乎总是将相同的标记传递给较低级别​​的async 方法(假设它们支持取消)。 CancellationToken 确实支持一些非常高级的组合器,但它们几乎从未使用过。

    主要缺点是您将背离基于任务的异步模式。您必须记住,任何 Microsoft 或第 3 方代码都将采用显式 CancellationToken - sp 您必须在最低级别的 async 方法中显式将其从环境上下文中拉出。此外,稍后维护您的代码库的程序员可能会期待 TAP。

    在考虑实施时也存在挑战。您希望隐式 CancellationToken 遵循 async 方法的调用,即使它们更改了线程上下文。我的意思是,考虑一下:方法A 在等待方法B 的结果之前调用ConfigureAwait(false)。您不能使用简单的线程局部静态属性,因为您需要遵循从一个线程到另一个线程的异步执行上下文。

    我似乎记得读过有关执行此操作的方法(可能使用CallContext 类?),但一旦您这样做,您的性能就会下降(执行上下文迁移代码已针对默认场景进行了高度优化)。

    【讨论】:

    • 再次感谢您的详细回答:)
    • “我似乎记得读过有关执行此操作的方法(可能使用 CallContext 类?)...” 是的,.NET 4.5 的当前内部版本对此提供了支持,但这是't 在 //BUILD 发布的版本中。
    猜你喜欢
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多