![](/img/trans.png)
[英]C# async, Stop all tasks when one is finished without the access to the code
[英]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.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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.