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

C# 异步CTP-环境取消令牌和IProgress,c#,.net,task-parallel-library,async-ctp,.net-4.5,C#,.net,Task Parallel Library,Async Ctp,.net 4.5,请记住,异步CTP通过环境同步上下文促进隐式调度,我有什么理由不让我的取消令牌和IProgress也环境化 我目前正在通过方法传递这些方法,就像我传递一个TaskScheduler来进行显式调度一样。然而,鉴于调度程序现在应该是环境的,我是否可以对其他问题遵循相同的规则?CancellationToken比IProgress更可能出现这种情况。使用IProgress,您通常在不同级别上有不同的T(高级async方法将其低级wait调用的进度通知组合在一起)。使用CancellationToken

请记住,异步CTP通过环境
同步上下文
促进隐式调度,我有什么理由不让我的
取消令牌
IProgress
也环境化


我目前正在通过方法传递这些方法,就像我传递一个
TaskScheduler
来进行显式调度一样。然而,鉴于调度程序现在应该是环境的,我是否可以对其他问题遵循相同的规则?

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

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

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


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

再次感谢你的详细回答:)“我似乎记得读过一篇关于实现这一点的文章(可能使用CallContext类?)”是的,当前的.NET 4.5内部版本支持此功能,但在//BUILD发布的版本中没有此功能。