如果可以编写我们自己的可等待对象,那么为什么异步方法只能返回 Task<T>、Task 和 void?

use*_*000 4 .net c# asynchronous async-await

我正在查看 MSDN 文档,它说

异步方法有三种可能的返回类型:Task<TResult>Task,和void

https://msdn.microsoft.com/en-us/library/mt674893.aspx

但是,我记得在其他地方读到可以写入await自定义等待者。我如何调和这两个事实?

Ste*_*ary 5

await支持任何类型的“awaitable”,它们是遵循某种模式(GetAwaiter等)的对象实例。

async生成一个状态机,它只知道如何创建Task/Task<T>等待(或返回void)。

因此,您可以创建自己的自定义可等待对象并返回它,但您必须明确地这样做。你不能async用来做。

编译器团队目前正在考虑添加ValueTaskasync. 这将允许您使用遵循模式的“异步方法构建器”。然后,您就可以使用asyncawait操作任何类型的“类任务”类型。不幸的是,它仍然不允许async方法返回接口类型,尽管 - 为此需要更改语言的其他部分。

  • 我现在已经测试过了,只要提供了正确的异步方法构建器,VS2017RC 就允许异步方法返回与任何其他自定义类型相同的接口类型。 (2认同)