2012-02-08 88 views
1

據微軟(link),有兩種方法來啓動一個任務:明確任務並行(TPL)和任務調度在C#

假設我在主線程中創建了4個不同的任務,分別稱爲task1,task2,task3和task4。

案例1:我跑所有這些,明確在主線程:

task1.Start(); 
task2.Start(); 
task3.Start(); 
task4.Start(); 

案例2:我運行它們隱含使用Parallel.Invoke方法在主線程:

Parallel.Invoke(task1, task2, task3, task4); 

的我注意到的唯一區別是在case2中,主線程暫停,直到Invoke()返回。

我的問題是關於任務調度程序。 在調度方面,它們在case1和case2中的行爲有4個不同的任務嗎?它們是完全等價的嗎?

在我上面我們已經提到的相同鏈接

閱讀:

在後臺,任務排隊到線程池,這一直是 加強與算法(如爬山)決定和 調整最大化吞吐量的線程數量。這使得 任務相對輕量級,並且您可以創建其中的許多任務來啓用細粒度並行。爲了補充這一點,採用廣爲人知的工作竊取算法來提供負載平衡。

+0

這是好奇還是你有一些代碼依賴於這些信息? – Tudor 2012-02-08 15:50:35

+0

是的。它出於好奇。我沒有找到任何參考,所以我決定發佈這個看看是否有人可以給我一個提示。 – ManiAm 2012-02-08 17:43:03

回答

4

This blog post來自Parallel團隊應回答您的一些問題。

簡短的回答:任務你必須在你的主線程上執行一個Task :: WaitAll(...)來防止退出,因爲Parallel :: Invoke實際上會爲你處理這個問題。除此之外,沒有別的,因爲在Parallel :: Invoke下使用了相同的TPL基礎結構。

+0

是的。由於任務的線程是後臺,我們必須阻塞主線程(例如使用WaitAll)並等待它們完成,否則它們會突然終止。 我同意,在Invoke中使用相同的TPL基礎結構。從這張照片可以看出: http://dl.dropbox.com/u/5153771/ParallelProgramming.png。 但這是否意味着它們在調度方面是等價的?謝謝你的答案和偉大的博客文章。 – ManiAm 2012-02-09 10:29:10

+0

在這兩種情況下都使用相同的任務調度程序 – 2012-02-09 14:10:28