采取以下方法:
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.
对于我自己来说,我可以想象两种方式:
- 迭代
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;
}
}
有没有更好的方法来实现这种行为?
结构方法行不通。如果你想异步返回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(使用前将#替换为@)