首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从异步方法返回IAsyncEnumerable

从异步方法返回IAsyncEnumerable
EN

Stack Overflow用户
提问于 2020-01-10 21:55:46
回答 1查看 18.9K关注 0票数 18

采取下列方法:

代码语言:javascript
复制
public async IAsyncEnumerable<int> Foo()
{
   await SomeAsyncMethod();
   return Bar(); // Throws since you can not return values from iterators
}

public async IAsyncEnumerable<int> Bar()
{
   for(int i = 0; i < 10; i++)
   {
       await Task.Delay(100);
       yield return i;
   }
}

我想知道最好的实践是什么,去做什么,上面的代码试图。基本上从一个IAsyncEnumerable方法返回一个async

对我自己来说,我可以想象出两种方式:

  1. 迭代IAsyncEnumerable并立即返回结果。

代码语言:javascript
复制
await foreach(var item in Bar())
{
    yield return item;
}

  1. 创建了一个可以临时存储IAsyncEnumerable的结构,这似乎是更好的解决方案,但仍然有点过火。

代码语言:javascript
复制
return new AsyncEnumerableHolder<int>(Bar());

public struct AsyncEnumerableHolder<T>
{
    public readonly IAsyncEnumerable<T> Enumerable;

    public AsyncEnumerableHolder(IAsyncEnumerable<T> enumerable)
    {
        Enumerable = enumerable;
    }
}

有什么更好的方法来实现这种行为吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-11 01:30:19

结构化方法是行不通的。如果要异步返回IAsyncEnumerator<T>值,可以在return Bar();中使用Task<IAsyncEnumerator<T>>。然而,这将是不寻常的。更自然的做法是创建一个新的IAsyncEnumerator<T>,它在异步枚举开始时集成了await SomeAsyncMethod()。要做到这一点,您应该按照选项(1)的建议使用awaityield

代码语言:javascript
复制
public async IAsyncEnumerable<int> Foo()
{
  await SomeAsyncMethod();
  await foreach (var item in Bar())
    yield return item;
}

另外,对于这种“将整个序列枚举到我的结果序列”概念,JavaScript有一个非常好的yield*语法,它既支持同步序列,也支持异步序列。C#对于同步序列或异步序列都没有这种语法。

票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59689529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档