看来任何实现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
关于c# - C#异步方法返回类型是否可能不是Task <T>或void?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41732886/