348

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

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

演示代码:

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

真正的任务与网页无关,因此创造性的网络抓取解决方案无济于事。

4

4 回答 4

643

您可以MaxDegreeOfParallelismParallelOptions参数中指定 a:

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

MSDN:Parallel.ForEach

MSDN:ParallelOptions.MaxDegreeOfParallelism

于 2012-02-15T09:11:19.800 回答
50

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

Parallel.ForEach(
    listOfwebpages, 
    new ParallelOptions{MaxDegreeOfParallelism=2}, 
    webpage => {Download(webpage);});     
于 2012-02-15T09:11:48.793 回答
24

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

于 2012-02-15T09:12:17.350 回答
16

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

Parallel.ForEach(listOfWebpages, New ParallelOptions() With {.MaxDegreeOfParallelism = 8}, Sub(webpage)
......end sub)  
于 2016-08-16T18:18:24.537 回答