如何限制 Parallel.ForEach?
我有一个 Parallel.ForEach() 异步循环,我用它下载一些网页。我的带宽有限,因此我每次只能下载 x 个页面,但 Parallel.ForEach 会执行所需网页的整个列表。
有没有办法在运行 Parallel.ForEach 时限制线程数或任何其他限制器?
演示代码:
Parallel.ForEach(listOfWebpages, webpage => {
Download(webpage);
});
真正的任务与网页无关,因此创造性的网络爬行解决方案无济于事。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您可以在 ParallelOptions 参数中指定 MaxDegreeOfParallelism:
MSDN:Parallel.ForEach
MSDN:ParallelOptions.MaxDegreeOfParallelism
You can specify a
MaxDegreeOfParallelism
in aParallelOptions
parameter:MSDN: Parallel.ForEach
MSDN: ParallelOptions.MaxDegreeOfParallelism
您可以使用 ParallelOptions 并设置 MaxDegreeOfParallelism 来限制并发线程数:
You can use ParallelOptions and set MaxDegreeOfParallelism to limit the number of concurrent threads:
使用 Parallel.Foreach 的另一个重载,它采用
ParallelOptions
实例,并设置MaxDegreeOfParallelism
以限制并行执行的实例数量。Use another overload of
Parallel.Foreach
that takes aParallelOptions
instance, and setMaxDegreeOfParallelism
to limit how many instances execute in parallel.对于 VB.net 用户(语法很奇怪并且很难找到)...
And for the VB.net users (syntax is weird and difficult to find)...
我认为更动态和现实的方法是通过处理器数量来限制它,这样在每个系统上它都会正常运行:
perhpas yu 会乘以
Environment.ProcessorCount
或除以它以施加或承受更大的压力从CPUI think the more dynamic and realistic approach would be to limit it by the processor count, so on each system it would function properly:
perhpas yu would multiply
Environment.ProcessorCount
or divide it to put or take more pressure from the CPU