對於第一個問題:
將這些任務執行一個由一個或異步。
(在這裏,我想你的意思同時,這是不完全一樣)
使用StartNew
將在當前TaskScheduler
運行任務。默認情況下表示它將使用ThreadPool
,如果線程池中有任何可用插槽,則它將並行運行。如果所有插槽都在任務池中進行,則可能會限制任務的執行,以避免CPU不堪重負,並且可能不會同時執行任務:沒有保證。
這是一個簡單的說明,關於調度策略的更完整和詳細的解釋是explained on the TaskScheduler documentation。
作爲一個側面說明。 documentation for 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
的一部分,則尤其如此。
因此,您應該更喜歡using WhenAll()
。它返回一個任務,其可以被期待已久的或在其上ContinueWith
可以稱爲
例如:
var tasks = new Task[] {Task.Factory.StartNew(A), Task.Factory.StartNew(B), Task.Factory.StartNew(C)};
await Task.WhenAll(tasks);
你可能是指'ThreadPool' – i3arnon
絕對,我的壞。 TaskPool存在,但它是一個Reactive Extension概念。對困惑感到抱歉。 –