我想知道什么是最好的方法,或者有什么文档/文章可以帮助我确定在每个循环的普通循环中使用Parallel.foreach和Task有什么区别,如下所示:
情况1-Parallel.foreach:
Parallel.foreach
{
// Do SOmething thread safe: parsing an xml and then save
// into a DB Server thry respoitory approach
}
情况2-foreach中的任务:
foreach
{
Task t1 = Task.factory.startNew(()=>
{
//Do the same thing as case 1 that is thread safe
}
}
Task.waitall()
虽然案例1和案例2几乎是1:4?那么这是否意味着如果我们想在循环中并行运行,我们应该始终使用parallel.foreach或parallel.for吗?
首先,关于该主题的最佳文档是通过C#编写的CLR的第五部分。
其次,我希望Parallel.Foreach的性能更好,因为它不仅可以创建任务,而且可以对它们进行分组。在Jeffrey Richter的书中,他解释了将单独启动的任务放入线程池队列中。锁定实际的线程池队列有一些开销。为了解决这个问题,任务本身对创建的任务有自己的队列。Tasks拥有的这个Task子队列实际上可以做一些工作而无需锁定!
我将不得不再次阅读该章(第27章),所以我不确定Parallel.Foreach是否以这种方式工作,但这是我期望的。
他解释说,锁定是昂贵的,因为它需要访问内核级别的构造。
无论哪种情况,都不要指望它们按顺序进行处理。由于上述内部原因,使用Parallel.Foreach与foreach关键字相比,顺序处理的可能性较小。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句