1

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

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


我的 1 条评论:我可以在另一个类(不是 Task)上创建自定义等待器,但是异步方法只能返回 Task 或 void,并且包装每个任务/异步方法调用并不实用/优雅。

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

我的 3 条评论:.Net 4.0 和我的自定义 TaskAwaiter 一切正常。

4

1 回答 1

3

你不能这样做。自定义等待者用于自定义类型(即使这样,通常也有更好的做事方式)。一种替代方法是使用 的扩展方法Task,类似于ConfigureAwait工作原理。

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

如果要携带“环境”数据,则可以使用CallContext.LogicalSetDataand CallContext.LogicalGetData。但是,您应该只在其中存储不可变数据,并且该解决方案适用于 .NET 4.5。我的博客上有更多详细信息。

于 2013-09-12T13:41:53.120 回答