如何限制Parallel.ForEach

本文关键字:ForEach Parallel 何限制 | 更新日期: 2023-09-27 18:24:33

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

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

演示代码:

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

真正的任务与网页无关,所以创造性的网络爬行解决方案也于事无补。

如何限制Parallel.ForEach

您可以在ParallelOptions参数中指定MaxDegreeOfParallelism

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

MSDN:每个的并行

MSDN:ParallelOptions.MaxDegreeOfParallelism

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

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

使用Parallel.Foreach的另一个重载,该重载采用ParallelOptions实例,并设置MaxDegreeOfParallelism以限制并行执行的实例数量。

对于VB.net用户来说(语法很奇怪,很难找到)。。。

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

我认为更动态、更现实的方法是通过处理器数量来限制它,这样在每个系统上都能正常工作:

var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount };
Parallel.ForEach(myList, options, iter => { });

perhapas yu会乘以Environment.ProcessorCount或将其除以,以从CPU 中施加或承受更大的压力