我有一个Parallel.ForEach()异步循环,我用它来下载一些网页。我的带宽有限,所以我每次只能下载x页,但Parallel.ForEach会执行所需网页的完整列表。
有没有办法在运行Parallel.ForEach时限制线程号或任何其他限制器?
演示代码:
Parallel.ForEach(listOfWebpages, webpage => {
Download(webpage);
});
真正的任务与网页无关,因此创意网络抓取解决方案无济于事。
答案 0 :(得分:498)
您可以在MaxDegreeOfParallelism
参数中指定ParallelOptions
:
Parallel.ForEach(
listOfWebpages,
new ParallelOptions { MaxDegreeOfParallelism = 4 },
webpage => { Download(webpage); }
);
MSDN:Parallel.ForEach
答案 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)