是否有可能有C#异步方法返回类型是不是任务<T>或无效?
看来任何实现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