C# 如何限制Parallel.ForEach?

C# 如何限制Parallel.ForEach?,c#,.net,asynchronous,parallel.foreach,C#,.net,Asynchronous,Parallel.foreach,我有一个并行的.ForEach()异步循环,可以用来下载一些网页。我的带宽有限,所以每次只能下载x页,但Parallel.ForEach会执行所需网页的整个列表 运行Parallel.ForEach时,是否有方法限制线程数或任何其他限制器 演示代码: Parallel.ForEach(listOfWebpages, webpage => { Download(webpage); }); 真正的任务与网页无关,因此创造性的网页爬网解决方案将无济于事。您可以在ParallelOption

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

运行Parallel.ForEach时,是否有方法限制线程数或任何其他限制器

演示代码:

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

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

您可以在
ParallelOptions
参数中指定
MaxDegreeOfParallelism

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


MSDN:

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

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

使用另一个重载的
Parallel.Foreach
来获取一个实例,并设置
MaxDegreeOfParallelism
来限制并行执行的实例数。

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


它可能不适用于这个特殊的情况,但我想我会把它扔掉,以防有人对此产生疑问并发现它有用。这里我使用处理器计数的75%(四舍五入)
var opts=newparalleloptions{maxdegreeofpparallelism=Convert.ToInt32(Math.天花((Environment.ProcessorCount*0.75)*1.0))
为了避免其他人在文档中查找它,传递值
-1
与根本不指定它是一样的:“如果[值]为-1,则并发运行的操作数没有限制”文档中我不清楚-是否将MaxDegreeOfParallelism设置为4(例如)意味着每个线程将运行循环迭代的1/4(一轮4个线程调度),或者每个线程仍然执行一个循环迭代,我们只是限制并行运行的数量?很明显,内核和线程不是一回事。根据CPU的不同,每个核心有不同数量的线程,通常每个核心2个。例如,如果您有一个4核CPU,每个核有2个线程,那么最多有8个线程。调整@jKlaus comment
var opts=new ParallelOptions{maxdegreeofpparallelism=Convert.ToInt32(Math.天花((Environment.ProcessorCount*0.75)*2.0))。链接到threads vs cores-@jKlaus如果列表没有修改,例如,它只是一组URL,我真的看不出问题吗?@Shiv,如果有足够的时间,你会。。。计算您的执行次数,并将其与列表的计数进行比较。@jKlaus您说什么会出错?@jKlaus您正在修改一个非线程安全的元素(整数)。我希望它在那种情况下不会起作用。另一方面,OP没有修改任何需要线程安全的内容。@jKlaus这里是Parallel.ForEach的一个示例,它正确设置了计数>。MSDN链接:
Parallel.ForEach(listOfWebpages, New ParallelOptions() With {.MaxDegreeOfParallelism = 8}, Sub(webpage)
......end sub)