我怎样才能限制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)