【发布时间】:2021-02-11 10:15:45
【问题描述】:
我有两种方法连接到Foos 的两个不同来源,它们返回两个IAsyncEnumerable<Foo>。我需要从两个来源获取所有Foos,然后才能处理它们。
问题:我想同时查询两个源(异步),即。在开始枚举Source2之前不等待Source1完成枚举。据我了解,这就是下面的方法SequentialSourcesQuery 示例中发生的情况,对吗?
对于常规任务,我会启动第一个任务,然后是第二个任务,然后调用await Task.WhenAll。但是我对如何处理IAsyncEnumerable有点困惑。
public class FoosAsync
{
public async IAsyncEnumerable<Foo> Source1() { }
public async IAsyncEnumerable<Foo> Source2() { }
public async Task<List<Foo>> SequentialSourcesQuery()
{
List<Foo> foos = new List<Foo>();
await foreach (Foo foo1 in Source1())
{
foos.Add(foo1);
}
await foreach (Foo foo2 in Source2())
{ //doesn't start until Source1 completed the enumeration?
foos.Add(foo2);
}
return foos;
}
}
【问题讨论】:
-
一种解决方法是简单地启动两个新任务,然后在这些任务中运行循环。
-
另外,从多个线程添加到列表时要小心。如讨论here
-
@smoksnes 好的,谢谢,我会看看。实际上这两个列表是不同的,我只是过度简化了这个例子。
标签: c# async-await iasyncenumerable