我怎样才能限制Parallel.ForEach?

我有一个Parallel.ForEach()asynchronous循环,我下载了一些网页。 我的带宽是有限的,所以我可以每次只下载x页,但是Parallel.ForEach执行所需网页的整个列表。

有没有办法在运行Parallel.ForEach时限制线程数或其他限制器?

演示代码:

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

真正的任务与网页无关,所以创造性的网页爬行解决scheme将无济于事。

您可以在ParallelOptions参数中指定MaxDegreeOfParallelism

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

MSDN: Parallel.ForEach

MSDN: ParallelOptions.MaxDegreeOfParallelism

您可以使用ParallelOptions并设置MaxDegreeOfParallelism来限制并发线程的数量:

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

使用Parallel.Foreach另一个重载,它接受一个ParallelOptions实例,并设置MaxDegreeOfParallelism以限制并行执行多less个实例。

而对于VB.net用户(语法很奇怪,很难find)…

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