从异步方法返回 IAsyncEnumerable

2024-03-10

采取以下方法:

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 method.

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

  1. 迭代IAsyncEnumerable并立即返回结果。
await foreach(var item in Bar())
{
    yield return item;
}
  1. 创建一个可以存储的结构体IAsyncEnumerable暂时,这似乎是更好的解决方案,但仍然有点矫枉过正。
return new AsyncEnumerableHolder<int>(Bar());

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

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

有没有更好的方法来实现这种行为?


结构方法行不通。如果你想异步返回IAsyncEnumerator<T>价值,你could use Task<IAsyncEnumerator<T>> with return Bar();。然而,这将是不寻常的。创建一个新的会更自然IAsyncEnumerator<T>其中包含await SomeAsyncMethod()在异步可枚举的开头。为此,您应该使用await and yield按照您的选项 (1) 的建议:

public async IAsyncEnumerable<int> Foo()
{
  await SomeAsyncMethod();
  await foreach (var item in Bar())
    yield return item;
}

顺便说一句,JavaScript 有一个非常好的yield*这种“将整个序列枚举到我的结果序列中”概念的语法,并且它支持同步和异步序列。 C# 对于同步或异步序列都没有这种语法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从异步方法返回 IAsyncEnumerable 的相关文章

随机推荐

  • 字段中的空值会生成 MatchError

    下面的内容很有趣 val rddSTG sc parallelize List RTD ANT SOYA BEANS 20161123 20161123 4000 docid11 null 5 RTD ANT SOYA BEANS 2016
  • 如何使用.NET反射来确定方法返回类型(包括void)和参数?

    如何知道参数的个数和类型 如何知道返回类型 如何检查返回类型是否为void Use MethodInfo ReturnType http msdn microsoft com en us library system reflection
  • 在 Keras 损失函数中重塑 TensorFlow 张量?

    有没有办法在自定义 Keras 损失函数内重塑 TF 张量 我正在为卷积神经网络定义这个自定义损失函数 def custom loss x x hat Custom loss function for training background
  • Android Parcelable 数组问题

    大家好 我已经构建了一个实现 Parcelable 的类 但是当我读取该类时 我定义的 arraylist 属性之一变为空 这是代码 package roblestech laCartelera import java util Array
  • 如何用C++读取系统信息?

    我正在尝试使用 C 获取 Linux 系统上的操作系统版本 硬盘空间 可用磁盘空间以及已安装 RAM 等信息 我知道我可以使用system 运行不同的 Linux 命令并捕获它们的输出 这就是我目前正在做的 但我想知道是否有更好的方法 C
  • 如何使用 d3 生成 svg 客户端而不将其附加到 DOM(与 React.js 一起使用)

    我正在使用 React js 构建一个应用程序 其中包含相当多的 svg 图表 我使用 d3 函数来帮助创建图表 例如比例尺 然后使用 React 生成 svg 元素 这是关于该方法的精彩文章 http 10consulting com 2
  • 如何将变量传递给 re.sub 回调?

    我正在使用 re sub 回调将子字符串替换为随机值 但我希望不同字符串中的随机值相同 由于 re sub 回调不允许参数 我不知道如何做到这一点 这是我正在做的事情的简化版本 def evaluate match mappings A 1
  • 条件语句如何与按位运算符一起使用?

    我试图理解 if 条件如何与按位运算符一起使用 检查数字是偶数还是奇数的方法可以通过以下方式完成 include
  • JavaScript 伪协议实际上是做什么的? [复制]

    这个问题在这里已经有答案了 换句话说 两者之间有什么区别 onclick myFunction and onclick JavaScript myFunction The JavaScript 事件处理程序中的 TYPE LABEL PRE
  • 避免目录中一次发生太多更改的错误

    如何避免C 中FileSystemWatcher的错误 目录中一次更改太多 我必须检测网络共享上的所有更改 InternalBufferSize 增加到 8192 128 您应该做两件事 Set InternalBufferSize到支持的
  • Python 使用 curve_fit 拟合对数函数

    我正在尝试使用拟合对数曲线curve fit 假设如下Y a ln X b 但拟合的数据看起来仍然不正确 现在我正在使用以下代码 from scipy optimize import curve fit X 3 0 3 1 3 2 3 3
  • Python(pandas):使用多索引将数据帧存储在hdf5中

    我需要使用具有多索引的大尺寸数据框 因此我尝试创建一个数据框来学习如何将其存储在 hdf5 文件中 数据框是这样的 前2列有多重索引 Symbol Date 0 C 2014 07 21 4792 B 2014 07 21 4492 A 2
  • 由 PKCS#7 加密消息保护的 API

    我当前正在尝试调用一个 API 该 API 要求我将 XML 数据放入 PKCS 7 格式 该数据被发布到 API 端点 响应还采用 PKCS 7 加密消息的形式 MIME 类型为 application pkcs7 mime 他们提供的一
  • 列出目录中的图像(01.png)和描述(01.txt)

    如何显示目录中的图像并获取每个图像的相应描述 假设描述存在 在目录中 01 png 01 txt 02 png 03 png 03 txt etc 显示为 img src 01 png br This is the description
  • 如何在 android 中创建自定义开关,并在开关轨道两侧和拇指上显示文本?

    如何在 android 中设计自定义开关 如下图所示 当它打开时 它需要看起来像这样 我还需要在两个类别之间切换时显示切换动画效果 我怎样才能实现它 是否有可用的第三方 SDK 或库 目前我已经用自定义线性布局设计它 如下所示 my lay
  • 列表理解与元组分配

    我想问一下python中是否可以实现这样的事情 a b i i 1 for i in range 5 我知道这是不可能的 因为我有一个错误 但我认为你明白我想要实现的目标 让我澄清一下 我可以这样做 a b 3 2 3 编辑 gt 或者甚至
  • Python 大列表排序与存储

    我目前正在处理一些非常大的信息列表 50 到 1 亿个条目 其中列表中的每个项目都采用 float string 1 string 2 的形式 我以未排序的方式将元素添加到列表中 并且最终希望有一个按浮点值排序的列表 例如 我会有一个如下所
  • Azure DevOps 构建子模块

    我有一个连接到 Azure DevOps 构建管道的私有 bitbucket 存储库 私有存储库有一个连接到公共 Github 存储库的子模块 这两个存储库均通过 SSH 访问 我在 DevOps 中勾选了克隆子模块框 如何向 Azure
  • Jquery - 确保事件处理程序在处理程序链中最后执行

    有没有办法确保您附加的事件处理程序是要执行的事件处理程序链中的最后一个 我有一个通过 ajax 提交表单的事件处理程序 但稍后 在附加我的 ajax 提交处理程序后 另一个处理程序将附加到表单以执行验证逻辑 验证逻辑应该发生在 ajax 提
  • 从异步方法返回 IAsyncEnumerable

    采取以下方法 public async IAsyncEnumerable