我们有这样的代码:
var intList = new List<int>{1,2,3};
var asyncEnumerables = intList.Select(Foo);
private async IAsyncEnumerable<int> Foo(int a)
{
while (true)
{
await Task.Delay(5000);
yield return a;
}
}
我需要为每个asyncEnumerable
条目启动await foreach
。每个循环迭代都应该互相等待,当每个迭代完成时,我需要收集每个迭代的数据并通过另一种方法处理。
我能通过TPL实现这一点吗?不然的话,你就不能给我出点主意吗?
2条答案
按热度按时间mnemlml81#
对我有用的是this repo中的
Zip
函数(81行)我是这样用的
watbbzwu2#
下面是一个可以使用的泛型方法
Zip
,它被实现为iterator。cancellationToken
使用EnumeratorCancellation
属性进行修饰,因此生成的IAsyncEnumerable
对WithCancellation
友好。使用示例:
此实现不是并发的。
MoveNextAsync
操作随后启动,一个在另一个完成之后。实现一个并发的实现(ZipConcurrent
)是可能的,而且应该不是特别困难,但是应该谨慎。这种实现也不是100%可靠的。它假设没有
GetAsyncEnumerator
调用会失败,也没有DisposeAsync
调用会同步或异步失败,否则可能会保留一些枚举器。这些都是合理的假设,但是一个完美的健壮实现不应该依赖于任何这些假设。