簡體   English   中英

Task.WaitAll()的行為如何?

[英]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.

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