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

时间:2016-07-11 15:44:21

标签: c# asynchronous concurrency 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;
}

此代码有什么问题吗?我没有得到正确的结果。我对async / await并不太了解。我观察到这个函数返回列表而没有组合所有并发调用的结果。有人可以让我知道如何组合来自所有并发呼叫的列表,然后才返回?

2 个答案:

答案 0 :(得分: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();
}

使用以下代码段,我做了几项重要更改。

  1. 后缀TaskTask<T>返回方法&#34; Async&#34;
  2. 利用Enumerable.Range代替for循环
    • 这将返回IEnumerable<Task<List<string>>>
    • 的列表
  3. 并行运行所有查询

答案 1 :(得分:2)

我建议使用Task.WhenAll()。我创建了这些方便的扩展方法,您可能会发现它们非常有用:

public static Task<TResult[]> SelectAsync<T, TResult>(
    this IEnumerable<T> list, 
         Func<T, Task<TResult>> functionToPerform)
{
    var tasks = list.Select(functionToPerform.Invoke);
    return Task.WhenAll(tasks);
}

以下是如何使用它的示例:

var results = await myItems.SelectAsync(item => DoStuff(item)).ConfigureAwait(false);