C#完成所有完成时添加异步方法的结果

时间:2016-06-24 17:31:48

标签: c# asynchronous

我有一个异步方法,可获取汽车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的争论。

编辑:

enter image description here

1 个答案:

答案 0 :(得分:3)

如果您更改了taskList的声明以使用Task的通用版本,Task<T>代表T类型的未来值...

List<Task<List<long>>> taskList

现在任务的结果是List<long>而不是void,编译器类型推断会将您切换到Task.WhenAllTask.WhenAll<TResult>(Task<TResult> tasks)的不同重载。

  

创建一个任务,该任务将在可枚举集合中的所有Task对象完成时完成

     

[...]

     

返回任务的Task<TResult>.Result属性将被设置为一个数组,其中包含所提供任务的所有结果,其顺序与提供的相同(例如,如果输入任务数组包含t1, t2, t3 ,输出任务的Task<TResult>.Result属性将返回TResult[] arr[0] == t1.Result, arr[1] == t2.Resultarr[2] == t3.Result)。

因此,Task的类型为List<long>,以下语句是您访问整理结果数组的方式:

List<Long>[] resultLists = await Task.WhenAll(tasksList);