3 回答

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊
這兩個(gè)答案都沒有提到等待的Task.WhenAll
:
var task1 = DoWorkAsync();var task2 = DoMoreWorkAsync();await Task.WhenAll(task1, task2);
Task.WaitAll
和之間的主要區(qū)別在于Task.WhenAll
前者將阻塞(類似于Wait
在單個(gè)任務(wù)上使用),而后者將不會(huì)并且可以等待,從而將控制權(quán)交還給調(diào)用者,直到所有任務(wù)完成。
更重要的是,異常處理不同:
Task.WaitAll
:
至少有一個(gè)Task實(shí)例被取消 - 或者 - 在執(zhí)行至少一個(gè)Task實(shí)例期間拋出了異常。如果任務(wù)被取消,則AggregateException在其InnerExceptions集合中包含OperationCanceledException。
Task.WhenAll
:
如果任何提供的任務(wù)在故障狀態(tài)下完成,則返回的任務(wù)也將在Faulted狀態(tài)下完成,其中異常將包含來自每個(gè)提供的任務(wù)的一組未包裝的異常的聚合。
如果所提供的任務(wù)都沒有出現(xiàn)故障但至少其中一個(gè)被取消,則返回的任務(wù)將以“已取消”狀態(tài)結(jié)束。
如果沒有任何任務(wù)出現(xiàn)故障且沒有任何任務(wù)被取消,則生成的任務(wù)將以RanToCompletion狀態(tài)結(jié)束。如果提供的array / enumerable不包含任務(wù),則返回的任務(wù)將在返回給調(diào)用者之前立即轉(zhuǎn)換到RanToCompletion狀態(tài)。

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
你可以創(chuàng)建許多任務(wù),如:
List<Task> TaskList = new List<Task>();foreach(...){ var LastTask = new Task(SomeFunction); LastTask.Start(); TaskList.Add(LastTask);}Task.WaitAll(TaskList.ToArray());
- 3 回答
- 0 關(guān)注
- 1101 瀏覽