Parallel.ForEach为什么不运行多线程?今天我尝试对foreach语句做一些优化,它适用于XDocument。优化前:foreach(XElementeleminxDoc.Descendants("APSEvent").ToList()){//一些操作}优化后:Parallel.ForEach(xDoc.Descendants("APSEvent").ToList(),elem=>{//相同的操作});我在Parallel.ForEach(...)中看到.NET只打开了一个线程!因此,Parallel的时间跨度大于标准的foreach。为什么您认为.NET只打开了1个线程?因为锁定文件?谢谢按照设计,Parallel.ForEach可以使用比请求更少的线程来实现更好的性能。根据MSDN[链接]:默认情况下,Parallel.ForEach和Parallel.For方法可以使用可变数量的任务。这就是为什么ParallelOptions类具有MaxDegreeOfParallelism属性而不是“MinDegreeOfParallelism”属性的原因。这个想法是系统可以使用比请求处理循环更少的线程。.NET线程池允许并行任务的工作线程数随时间变化,从而动态适应不断变化的工作负载。在运行时,系统会观察增加线程数是提高还是降低总体吞吐量,并相应地调整工作线程数。像这样使用它:intParallelThreads=10;Parallel.ForEach(xDoc.Descendants("APSEvent").ToList(),newParallelOptions(){MaxDegreeOfParallelism=ParallelThreads},(myXDOC,i,j)=>{//在这里做任何你想做的事});从问题描述来看,没有什么可以解释为什么TPL不产生更多的多线程。没有任何证据表明问题存在问题。这很容易修复:您可以在进入循环之前记录线程ID,并在循环中做第一件事。如果它始终是相同的数字,则TPL无法生成线程。然后您应该尝试不同版本的代码,哪些更改会触发TPL以序列化所有内容。原因之一可能是您的列表中的元素数量较少。TPL对您的收藏进行分区,如果您只有几件物品,您可能最终只有一批。可以通过这种方式配置此行为。可能是您无意中锁定了一个循环,然后您会看到很多不同的数字,但没有加速。然后,简化代码,直到问题消失。并行方式并不总是比“旧时尚方式”快http://social.msdn.microsoft.com/Forums/en-US/parallelextensions/thread/c860cf3f-f7a6-46b5-8a07-ca2f413258dd是的,文档。Load(...)锁定文件,TPL由于线程间的资源争用无法使用多线程的强大特性。尝试将XML加载到流中,然后使用Parallel.For(...)。你碰巧有处理器吗?在这种情况下,TPL可以将线程数限制为1。如果集合非常小,也会发生同样的事情。尝试更大的集合。有关如何确定并行度的更多详细信息,请参阅此答案。以上是C#学习教程:为什么Parallel.ForEach不跑多线程?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
