2012-02-15 81 views
218

我有一個Parallel.ForEach()異步循環,我下載了一些網頁。我的帶寬有限,所以我只能每次下載x頁,但是Parallel.ForEach執行所需網頁的整個列表。如何限制Parallel.ForEach?

有沒有辦法在運行Parallel.ForEach時限制線程數或任何其他限制器?

演示代碼:

Parallel.ForEach(listOfWebpages, webpage => { 
    Download(webpage); 
}); 

真正的任務無關與網頁,太有創意了網頁抓取的解決方案也無濟於事。

+5

我看到你的清單上執行的Parallel.ForEach() - 我太喜歡住危險。 – jKlaus 2015-12-02 18:16:19

+0

@jKlaus如果列表未被修改,例如這只是一組網址,我真的不明白這個問題? – Shiv 2016-02-11 04:54:24

+0

@Shiv,給你足夠的時間你會......計算你的執行次數,並將它與列表的計數進行比較。 – jKlaus 2016-02-11 13:49:17

回答

394

您可以在ParallelOptions參數指定MaxDegreeOfParallelism

Parallel.ForEach(
    listOfWebpages, 
    new ParallelOptions { MaxDegreeOfParallelism = 4 }, 
    webpage => { Download(webpage); } 
); 

MSDN:Parallel.ForEach

MSDN:ParallelOptions.MaxDegreeOfParallelism

+27

它可能不適用於這種特殊情況,但我想我會扔掉它,以防萬一奇蹟在這一點,並認爲它很有用。 這裏我利用了75%(四捨五入)的處理器數量。 '選擇採用VAR =新ParallelOptions { MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.75)* 1.0)) };' – jKlaus 2015-12-02 18:18:59

+2

只是爲了救其他人不必看它的文檔中,傳遞「-1」的值與完全沒有指定值相同:_「如果[值]爲-1,併發運行次數沒有限制」_ – stuartd 2016-08-05 16:55:26

+0

對我而言,這並不清楚文檔 - 設置MaxDegreeOfParallelism爲4(例如)意味着將有4個線程運行循環迭代的1/4(分派4個線程的一輪),還是每個線程仍然執行一次循環迭代,我們只是限制並行運行多少個? – Hashman 2017-03-07 19:27:23

30

您可以使用ParallelOptions並設置MaxDegreeOfParallelism限制併發線程數:

Parallel.ForEach(listOfwebpages, new ParallelOptions{MaxDegreeOfParallelism=2}, webpage => {Download(webpage);});  
18

使用Parallel.Foreach的另一個過載,該過載需要一個ParallelOptions實例,並設置MaxDegreeOfParallelism以限制並行執行多少個實例。

6

而對於VB.net用戶(語法怪異,不易發現)...

Parallel.ForEach(listOfWebpages, New ParallelOptions() With {.MaxDegreeOfParallelism = 8}, Sub(webpage) 
......end sub) 
+0

太奇怪了,看起來沒有記錄 - 謝謝! – 2016-09-28 12:02:23