如何在 .Net 4.5 上对任务使用自定义任务等待程序

本文关键字:任务 自定义 程序 等待 Net | 更新日期: 2023-09-27 18:31:13

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

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


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

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

我的 3 条评论:一切都按预期工作 .Net 4.0 和我的自定义 TaskAwaiter。

如何在 .Net 4.5 上对任务使用自定义任务等待程序

你不能这样做。自定义等待者适用于自定义类型(即便如此,通常也有更好的执行方法)。一种选择是使用扩展方法进行Task,类似于ConfigureAwait的工作方式。

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

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