如何合并多个异步调用的结果

Pra*_*nth 6 c# concurrency asynchronous async-await

public async Task<List<string>> getAllQueries()
{ 
   List<string> allQueries = new List<string>();
   for (int i =0 ; i < 10; i++)
   {
      List<string> queries = await getQueriesForId(i);
      allQueries.AddRange(queries);
   }  
   return allQueries;
}
Run Code Online (Sandbox Code Playgroud)

这段代码有什么问题吗?我没有得到正确的结果。我对异步/等待不太了解。我观察到该函数返回列表,但没有合并所有并发调用的结果。有人可以让我知道如何合并来自所有并发调用的列表然后仅返回吗?

Dav*_*ine 3

我将使用该Task.WhenAll方法并在结果全部实现后将其合并,请考虑以下事项:

public async Task<List<string>> GetAllQueriesAsync()
{ 
   var tasks = 
       Enumerable.Range(0, 10)
                 .Select(i => GetQueriesForIdAsync(i));

   await Task.WhenAll(tasks);
   return tasks.SelectMany(t => t.Result).ToList();
}
Run Code Online (Sandbox Code Playgroud)

在下面的代码片段中,我做了几个关键的更改。

  1. 带有“Async”的后缀Task和返回方法Task<T>
  2. 使用Enumerable.Range而不是for循环
    • 这将返回一个列表IEnumerable<Task<List<string>>>
  3. 并行运行所有查询