我怎样才能限制Parallel.ForEach?

时间:2012-02-15 09:08:36

标签: c# .net asynchronous parallel.foreach

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

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

演示代码:

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

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

4 个答案:

答案 0 :(得分:498)

您可以在MaxDegreeOfParallelism参数中指定ParallelOptions

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

MSDN:Parallel.ForEach

MSDN:ParallelOptions.MaxDegreeOfParallelism

答案 1 :(得分:36)

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

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

答案 2 :(得分:20)

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

答案 3 :(得分:8)

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

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