我有一个异步方法,可获取汽车ID的List<long>
个组件ID。我想异步获得数百辆汽车的组件ID,所以我写了下面的方法。我的目标是实际添加所有GetAllComponentIdsForCar
任务的结果,并从下面的方法返回它们。
public async Task<List<long>> GetListOfComponentIds(List<long> carIds)
{
List<Task> tasksList = new List<Task>();
foreach (var carId in carIds)
{
Task<List<long>> getComponentIds = GetAllComponentIdsForCar(carId);
tasksList.Add(getComponentIds);
}
await Task.WhenAll(tasksList);
//List<long> sumOfAllTaskResults...or array...or something
}
我如何做到这一点?
注意 - 我正在寻找类似于angular q.all的东西,它只是在完成时返回所有任务(/ promise)结果的数组。
我已经设法从C#中的异步任务获得结果,但这涉及使数组成为预期任务的长度,这似乎是一种可怕的方式。
我在这里尝试阅读微软的文档和问题,但我看到的只是关于WaitAll与WhenAll的争论。
编辑:
答案 0 :(得分:3)
如果您更改了taskList
的声明以使用Task
的通用版本,Task<T>
代表T
类型的未来值...
List<Task<List<long>>> taskList
现在任务的结果是List<long>
而不是void
,编译器类型推断会将您切换到Task.WhenAll
,Task.WhenAll<TResult>(Task<TResult> tasks)
的不同重载。
创建一个任务,该任务将在可枚举集合中的所有Task对象完成时完成
[...]
返回任务的
Task<TResult>.Result
属性将被设置为一个数组,其中包含所提供任务的所有结果,其顺序与提供的相同(例如,如果输入任务数组包含t1, t2, t3
,输出任务的Task<TResult>.Result
属性将返回TResult[]
arr[0] == t1.Result, arr[1] == t2.Result
和arr[2] == t3.Result
)。
因此,Task
的类型为List<long>
,以下语句是您访问整理结果数组的方式:
List<Long>[] resultLists = await Task.WhenAll(tasksList);