是否有可能让C#异步方法返回类型不是Task <t>或void?

时间:2017-01-19 02:47:40

标签: c# async-await

似乎可以等待任何实现GetAwaiter要求的对象,Task<>类型只是满足此要求的众多可能类型之一。但是,就我所知,似乎async方法只能返回Task<>void。是否有可能挂钩我的自定义任务等待类型,所以我可以指定我的自定义等待类型作为异步返回类型,然后当然我可以随后链接await正常的调用链。类似的东西:(伪代码)

async MyAwaitable MyAwaitableMethod()
{
    await myAwaitable;
}

async Task MyTask()
{
    await MyAwaitableMethod();
}

背景信息:整个想法实际上源于C ++ 1z / 2x协程提案,它基本上具有相同的基本模型,但它允许更多控制来定义任何具有嵌入式的类型从协程返回promise_type(由于co_await)。

[编辑]

除了答案中提供的链接外,我还在以下链接中找到了更多信息,似乎确实有一些关于此主题的热门讨论:

  1. https://github.com/dotnet/roslyn/issues/7169
  2. https://github.com/dotnet/roslyn/issues/10902
  3. https://github.com/ljw1004/roslyn/blob/features/async-return/docs/specs/feature%20-%20arbitrary%20async%20returns%20-%20discussion.md
  4. [EDIT2]

    令人惊讶的是,在进一步挖掘之后,这实际上是C#7.0的一个预期功能:http://intellitect.com/generalized-async-return-types/

1 个答案:

答案 0 :(得分:9)

您想要的功能不存在。它已被提出,我相信有一个原型实现。见

https://github.com/dotnet/roslyn/issues/16476

设计说明。

如果您对此主题感兴趣,请考虑在Kotlin中查看广义协程功能的设计工作。好东西在这里。

https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md