异步CTP - 环境取消语音和IProgress

时间:2012-01-08 00:59:56

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

请注意,异步CTP通过环境SynchronizationContext促进隐式计划,是否有任何理由我不应该设置CancellationTokenIProgress环境?

我目前通过方法传递这些内容,就像我传递TaskScheduler进行显式调度一样。但是,看到调度程序现在应该是环境调度,我不能按照相同的规则来解决其他问题吗?

1 个答案:

答案 0 :(得分:4)

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

主要缺点是您将离开基于任务的异步模式。您必须记住,任何Microsoft或第三方代码都会明确CancellationToken - 您必须明确将其从最低级async中的环境上下文中删除方法。此外,稍后维护代码库的程序员可能会期待TAP。

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

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