如何在.Net 4.5上使用自定义TaskAwaiter执行任务?

时间:2013-09-12 13:09:16

标签: c# asynchronous async-await

我可以通过在Task上提供扩展方法GetAwaiter来创建我自己的.Net 4.0 TaskAwaiter,但是当使用.Net 4.5运行代码时,这是不可能的。

.Net 4.5上的Task类有一个名为GetAwaiter的方法,我的扩展方法永远不会被调用。


<子> 我的评论: 我可以在另一个类(不是Task)上创建自定义awaiter,但异步方法只能返回Task或void,并且包装每个任务/ async-method调用都不是实用/优雅。

<子> 我的2评论: 我需要的是在创建(或等待)任务时自动保存数据,并在继续方法上检索此数据,而不更改同步上下文。

<子> 我的3评论: 使用.Net 4.0和我的自定义TaskAwaiter,一切都按预期工作。

1 个答案:

答案 0 :(得分:3)

你不能这样做。自定义awaiters适用于自定义类型(即便如此,通常还有更好的处理方式)。另一种方法是使用Task的扩展方法,类似于ConfigureAwait的工作方式。

如果你想只携带本地数据,那么只需使用lambda变量捕获。

如果您想要传输“环境”数据,则可以使用CallContext.LogicalSetDataCallContext.LogicalGetData。但是,您应该只在那里存储不可变数据,并且该解决方案在.NET 4.5上运行。我有更多details on my blog