Parallel.ForEach / 多线程的最佳使用

Zoi*_*nky 4 .net c# multithreading parallel.foreach

我需要从网站上抓取数据。我有 1,000 多个链接需要访问,以前我将每个线程划分为 10 个链接,然后开始 100 个线程,每个线程拉取 10 个。经过几个测试用例后,100 个线程是最好的计数,以最大限度地减少它检索内容的时间所有的链接。

我意识到 .NET 4.0 为开箱即用的多线程提供了更好的支持,但这是根据您拥有的内核数量来完成的,在我的情况下,这不会产生足够的线程。我想我要问的是:优化 1,000 个链接拉动的最佳方法是什么。我应该使用.ForEach并让Parallel扩展控制产生的线程数量,还是找到一种方法来告诉它启动和划分工作的线程数?

我以前没有工作过,Parallel所以也许我的方法可能是错误的。

whi*_*hac 5

您可以使用 Parallel.ForEach 中的MaxDegreeOfParallelism属性来控制将产生的线程数。

这是代码片段-

ParallelOptions opt = new ParallelOptions();
opt.MaxDegreeOfParallelism = 5;

Parallel.ForEach(Directory.GetDirectories(Constants.RootFolder), opt, MyMethod);
Run Code Online (Sandbox Code Playgroud)


Cam*_*and 3

值得一试的是 TPL Dataflow 库。

MSDN 上的数据流

请参阅Parallel.ForEach 中的嵌套等待

Parallel.ForEach() 背后的整个想法是,您有一组线程,每个线程处理集合的一部分。正如您所注意到的,这不适用于异步等待,您希望在异步调用期间释放线程。

此外,演练创建数据流管道专门设置和处理多个网页下载。TPL Dataflow 确实是为该场景而设计的。