Parallel.ForEach vs Task.Factory.StartNew

Parallel.ForEach vs Task.Factory.StartNew

下面的代码片段有什么区别?两个都不会使用线程池线程吗?


例如,如果我想为集合中的每个项目调用一个函数,


Parallel.ForEach<Item>(items, item => DoSomething(item));


vs


foreach(var item in items)

{

  Task.Factory.StartNew(() => DoSomething(item));

}


元芳怎么了
浏览 1059回答 3
3回答

慕妹3242003

第一个是更好的选择。Parallel.ForEach在内部使用a&nbsp;Partitioner<T>将您的集合分发到工作项中。它不会为每个项目执行一项任务,而是批量处理以降低所涉及的开销。第二个选项将Task在您的集合中为每个项目安排一个。虽然结果将(几乎)相同,但这将引入远远超过必要的开销,特别是对于大型集合,并导致整体运行时间变慢。仅供参考 -&nbsp;如果需要,可以通过对Parallel.ForEach使用适当的重载来控制使用的分区程序。有关详细信息,请参阅MSDN上的自定义分区程序。在运行时,主要的区别是第二个将异步。这可以使用Parallel.ForEach通过执行以下操作进行复制:Task.Factory.StartNew(&nbsp;()&nbsp;=>&nbsp;Parallel.ForEach<Item>(items,&nbsp;item&nbsp;=>&nbsp;DoSomething(item)));通过这样做,您仍然可以利用分区程序,但在操作完成之前不要阻塞。

拉莫斯之舞

Parallel.ForEach将优化(甚至可能不启动新线程)并阻塞直到循环结束,Task.Factory将为每个项显式创建一个新的任务实例,并在它们完成之前返回(异步任务)。Parallel.Foreach效率更高。
打开App,查看更多内容
随时随地看视频慕课网APP