我可以通过在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,一切都按预期工作。 子>
答案 0 :(得分:3)
你不能这样做。自定义awaiters适用于自定义类型(即便如此,通常还有更好的处理方式)。另一种方法是使用Task
的扩展方法,类似于ConfigureAwait
的工作方式。
如果你想只携带本地数据,那么只需使用lambda变量捕获。
如果您想要传输“环境”数据,则可以使用CallContext.LogicalSetData
和CallContext.LogicalGetData
。但是,您应该只在那里存储不可变数据,并且该解决方案仅在.NET 4.5上运行。我有更多details on my blog。