【发布时间】:2020-04-28 13:36:46
【问题描述】:
采取以下方法:
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;
}
}
我想知道最佳实践是什么,做什么,上面的代码试图做什么。基本上从async 方法返回IAsyncEnumerable。
我自己可以想象两种方式:
- 遍历
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;
}
}
有没有更好的方法来实现这种行为?
【问题讨论】:
-
很确定
async期望您返回void、Task或Task<T>(尽管void几乎总是错误的选择) -
好吧,
public async IAsyncEnumerable<int> Bar()在语法上是完全有效的。我不确定你想说什么。 -
我想说的是
async只支持certain return types。将IAsyncEnumerable<T>作为返回类型应该 是编译器错误,因为它没有声明GetAwaiter方法。 -
这是我绝对需要 X 的另一个问题,因为我认为这是我问题的答案,但是,X 不起作用。相反,您应该解释您要达到的目标,当然还有其他选择。
-
@Powerlord 好吧,
IAsyncEnumerable<T>和IAsyncEnumerator<T>在 C#8 中绝对支持返回类型 - Asynchronous streams
标签: c# async-await c#-8.0 iasyncenumerable