[英]How Task.WaitAll() Behave?
我創建了一個Task
列表,如下所示:
public void A()
{
}
public void B()
{
}
public void C()
{
}
public void Ex()
{
Task.WaitAll(Task.Factory.StartNew(A), Task.Factory.StartNew(B), Task.Factory.StartNew(C));
var p=true;
}
現在我的問題是。 列表中的所有任務是逐個執行還是並行執行。
P =真
所有任務完成后或完成之前設置“p”?
對於第一個問題:
這些任務將逐個執行還是異步執行。
(在這里,我想你的意思是同時發生 ,這並不完全相同)
使用StartNew
將在當前的TaskScheduler
運行您的任務。 默認情況下,這意味着它將使用ThreadPool
,如果線程池中有任何可用的插槽,它將並行運行。 如果在任務池中獲取所有插槽,則可能會限制任務的執行,以避免CPU被淹沒,並且可能無法同時執行任務:無法保證。
這是一個簡化的解釋, 在TaskScheduler文檔中解釋了有關調度策略的更完整和詳細的說明。
作為旁注。 StartTask的文檔提到了StartNew(Action)
和Run(Action)
之間的細微差別。 與其他答案中所述不同,它們並不完全相同。
從.NET Framework 4.5開始,您可以使用Task.Run(Action)方法作為使用默認參數調用StartNew(Action)的快速方法。 但請注意,兩種方法之間的行為存在差異:默認情況下,Task.Run(Action)不允許使用TaskCreationOptions.AttachedToParent選項啟動的子任務附加到當前Task實例,而StartNew(Action)確實。
對於第二個問題
所有任務完成后或完成之前設置“p”?
簡短的回答是肯定的。
但是,您應該考慮使用另一種方法,因為這將阻止您的線程並等待空閑。 另一種方法是,如果可以,則將控制權交還給調用者,因此線程被釋放並可供CPU使用。 如果運行此代碼的線程是ThreadPool
一部分,則尤其如此。
因此,您應該更喜歡使用WhenAll()
。 它返回一個可以等待的Task或者可以調用ContinueWith
的Task
例:
var tasks = new Task[] {Task.Factory.StartNew(A), Task.Factory.StartNew(B), Task.Factory.StartNew(C)};
await Task.WhenAll(tasks);
第一:你是以錯誤的方式創造任務。 當你實例化一個任務時,你需要在它上面調用Start方法,否則它什么都不會。
new Task(() => /* Something * /).Start();
如果您按照剛才的方式創建任務(通過調用構造函數並命中啟動或使用TaskFacotry甚至Task.Run),默認情況下ThreadPool線程將專用於該任務,因此任務並行執行。
Task.WhenAll方法將阻止調用方法的執行,直到傳遞給它的所有任務都完成執行。
所以在完成所有任務后設置布爾變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.