簡體   English   中英

全部完成后,C#將異步方法的結果加起來

[英]C# Add Up Results of Async Methods When All Finished

我有一個異步方法,獲取汽車ID的組件ID的List<long> 我想異步獲取數百輛汽車的組件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東西 ,它在完成時僅返回所有任務(/承諾)結果的數組。

之前,我已經設法從C#中的異步任務獲取結果,但是這涉及到使數組具有預期任務的長度,這似乎是一種可怕的方法。

我確實嘗試在這里閱讀Microsoft的文檔和問題,但是我所看到的只是關於WaitAll與WhenAll的爭論。

編輯:

在此處輸入圖片說明

如果將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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM