【问题标题】:Is it possible to have C# async method return type to be something not Task<T> or void?是否可以让 C# 异步方法返回类型不是 Task<T> 或 void?
【发布时间】:2017-01-19 02:47:40
【问题描述】:

似乎任何实现GetAwaiter 要求的对象都可以等待,Task&lt;&gt; 类型只是满足此要求的众多可能类型之一。但是,据我所知,async 方法似乎只能返回Task&lt;&gt;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

[EDIT2]

令人惊讶的是,经过进一步挖掘,这实际上是 C# 7.0 的一个前瞻性特性:http://intellitect.com/generalized-async-return-types/

【问题讨论】:

标签: c# async-await


【解决方案1】:

更新:2017 年这个问题中提到的功能实际上是在 C# 7.0 中实现的;详情请见https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/async-return-types

2017 年的原始答案如下:


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

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

用于设计说明。

如果您对此主题感兴趣,还可以考虑研究 Kotlin 中通用协程功能的设计工作。好东西在这里。

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

【讨论】:

  • 谢谢,这帮助我更好地了解了当前 async/await 设施的范围!
  • 我相信它现在存在,但它似乎没有很好的记录(至少,我还没有找到一个很好的例子):stackoverflow.com/a/42753797/2173353
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
  • 2017-06-04
  • 2019-07-22
相关资源
最近更新 更多