Parallel.ForEach vs Task.Factory.StartNew下面的代码片段有什么区别?两个都不会使用线程池线程吗?例如,如果我想为集合中的每个项目调用一个函数,Parallel.ForEach<Item>(items, item => DoSomething(item));vsforeach(var item in items){ Task.Factory.StartNew(() => DoSomething(item));}
3 回答
慕妹3242003
TA贡献1824条经验 获得超6个赞
第一个是更好的选择。
Parallel.ForEach在内部使用a Partitioner<T>
将您的集合分发到工作项中。它不会为每个项目执行一项任务,而是批量处理以降低所涉及的开销。
第二个选项将Task
在您的集合中为每个项目安排一个。虽然结果将(几乎)相同,但这将引入远远超过必要的开销,特别是对于大型集合,并导致整体运行时间变慢。
仅供参考 - 如果需要,可以通过对Parallel.ForEach使用适当的重载来控制使用的分区程序。有关详细信息,请参阅MSDN上的自定义分区程序。
在运行时,主要的区别是第二个将异步。这可以使用Parallel.ForEach通过执行以下操作进行复制:
Task.Factory.StartNew( () => Parallel.ForEach<Item>(items, item => DoSomething(item)));
通过这样做,您仍然可以利用分区程序,但在操作完成之前不要阻塞。
拉莫斯之舞
TA贡献1820条经验 获得超10个赞
Parallel.ForEach将优化(甚至可能不启动新线程)并阻塞直到循环结束,Task.Factory将为每个项显式创建一个新的任务实例,并在它们完成之前返回(异步任务)。Parallel.Foreach效率更高。
- 3 回答
- 0 关注
- 1095 浏览
添加回答
举报
0/150
提交
取消