我需要处理列表中的一百万个元素。
将它们粗暴地扔进并行.ForEach只会让CPU饱和。
相反,我将元素主列表分成几部分,并将子列表放入并行循环中。
List<Element> MasterList = new List<Element>();
Populate(MasterList); // puts a Million elements into list;
//Split Master List into 100 Lists of 10.0000 elements each
List<List<Element>> ListOfSubLists = Split(MasterList,100);
foreach (List<Element> EL in ListOfSubLists )
{
Parallel.ForEach(EL, E =>
{
// Do Stuff
}
//wait for all parallel iterations to end before continuing
}
在继续上循环的下一次迭代之前等待所有并行迭代结束的最佳方法是什么?
Edit :
正如一些答案所述,“使CPU饱和”并不是一个准确的表达。
其实我只是想限制CPU的使用,避免这个处理给CPU带来过多的负载。
Parallel.ForEach
不会使CPU饱和;它使用一些智能来决定同时运行多少个并行线程,最多 63 个。
See: Parallel.ForEach 是否限制活动线程的数量? https://stackoverflow.com/questions/1114317/does-parallel-foreach-limits-the-number-of-active-threads
如果需要,您还可以通过提供一个来设置最大并行度ParallelOptions
like new ParallelOptions { MaxDegreeOfParallelism = 5 }
作为第二个参数Parallel.ForEach
.
作为最后一点,Parallel.ForEach
阻塞直到所有迭代完成。因此,您编写的代码可以正常工作。您无需等待迭代完成。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)