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并不太了解。我观察到这个函数返回列表而没有组合所有并发调用的结果。有人可以让我知道如何组合来自所有并发呼叫的列表,然后才返回?
答案 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();
}
使用以下代码段,我做了几项重要更改。
Task
和Task<T>
返回方法&#34; Async&#34; Enumerable.Range
代替for
循环
IEnumerable<Task<List<string>>>
答案 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);