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