异步CTP-环境取消令牌和IProgress

本文关键字:IProgress 令牌 取消 CTP- 环境 异步 | 更新日期: 2023-09-27 18:19:40

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

我目前正在传递这些方法,就像我传递TaskScheduler进行显式调度一样。然而,鉴于调度器现在应该是环境的,我可能不会对其他部分遵循同样的规则吗?

异步CTP-环境取消令牌和IProgress

CancellationTokenIProgress<T>更有可能出现这种情况。对于IProgress<T>,您通常在不同级别上有不同的T(更高级别的async方法将其较低级别await调用的进度通知组合在一起)。对于CancellationToken,相同的令牌几乎总是传递给较低级别的async方法(假设它们支持取消)。CancellationToken确实支持一些非常高级的组合子,但它们几乎从未被使用过。

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

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

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