看来任何实现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/

10-09 06:00
查看更多