似乎GetAwaiter
可以等待任何实现需求的对象,Task<>
类型只是满足此要求的众多可能类型之一.但是,似乎一种async
方法只能返回Task<>
或void
据我所知.是否有可能挂钩我的自定义任务等待类型,所以我可以指定我的自定义等待类型作为异步返回类型,然后当然我可以随后await
链接通常的调用链.像:(伪代码)
async MyAwaitable MyAwaitableMethod() { await myAwaitable; } async Task MyTask() { await MyAwaitableMethod(); }
背景信息:整个想法实际上源于C++ 1z/2x协程提案,它基本上具有相同的基本模型,但它允许更多控制来定义promise_type
从协程返回嵌入的任何类型(因此的co_await
).
[编辑]
除了答案中提供的链接之外,我还在以下链接中找到了更多信息,似乎确实有一些关于这个主题的热门讨论:
https://github.com/dotnet/roslyn/issues/7169
https://github.com/dotnet/roslyn/issues/10902
https://github.com/ljw1004/roslyn/blob/features/async-return/docs/specs/feature%20-%20arbitrary%20async%20returns%20-%20discussion.md
[EDIT2]
令人惊讶的是,在进一步挖掘之后,这实际上是C#7.0的一个预期功能:http://intellitect.com/generalized-async-return-types/
您想要的功能不存在.它已被提出,我相信有一个原型实现.看到
https://github.com/dotnet/roslyn/issues/16476
为设计说明.
如果您对此主题感兴趣,请考虑在Kotlin中查看广义协程功能的设计工作.好东西在这里.
https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md