c# - 从异步方法返回 IAsyncEnumerable
问题描述
采取以下方法:
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
方法返回一个。
对于我自己,我可以想象两种方式:
- 迭代
IAsyncEnumerable
并立即返回结果。
await foreach(var item in Bar())
{
yield return item;
}
- 创建一个可以
IAsyncEnumerable
临时存储的结构,这似乎是更好的解决方案,但仍然有点矫枉过正。
return new AsyncEnumerableHolder<int>(Bar());
public struct AsyncEnumerableHolder<T>
{
public readonly IAsyncEnumerable<T> Enumerable;
public AsyncEnumerableHolder(IAsyncEnumerable<T> enumerable)
{
Enumerable = enumerable;
}
}
有没有更好的方法来实现这种行为?
解决方案
struct 方法行不通。如果你想异步返回一个IAsyncEnumerator<T>
值,你可以使用Task<IAsyncEnumerator<T>>
with return Bar();
。然而,这将是不寻常的。在异步可枚举的开头创建一个新IAsyncEnumerator<T>
的合并会更自然。await SomeAsyncMethod()
为此,您应该按照选项 (1) 的建议使用await
和:yield
public async IAsyncEnumerable<int> Foo()
{
await SomeAsyncMethod();
await foreach (var item in Bar())
yield return item;
}
yield*
附带说明一下,对于这种“将整个序列枚举到我的结果序列”概念,JavaScript 有一个非常好的语法,它支持同步和异步序列。C# 没有这种用于同步或异步序列的语法。
推荐阅读
- r - 对 N 个正态分布求和
- java - Android Studio:如何将阿拉伯日期格式转换为英文?
- tensorflow - 谷歌云“无法为 TPU 实例创建没有基础映像的 Compute Engine 实例”
- javascript - react JS中的回调函数
- reactjs - 发出 POST 请求(使用 React)后执行新的 GET 请求是最佳做法吗?
- python-3.x - 通用视图中的 request.user 和 django 中的纯函数
- amazon-web-services - 是否可以确定在 cloudwatch aws 上发送警报的时间?
- python - 如何使用递归以最大深度搜索现有文件?
- ssl - 我托管 GitLab 的私人服务器是否需要有效的 CA 证书才能在单独的服务器上注册运行程序?
- amazon-web-services - CDK: How to get apigateway key value (即 x-api-key: *20 Chars*)