为了账号安全,请及时绑定邮箱和手机立即绑定

Parallel.ForEach vs Task.Factory.StartNew

Parallel.ForEach vs Task.Factory.StartNew

元芳怎么了 2019-07-25 15:47:52
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)));

通过这样做,您仍然可以利用分区程序,但在操作完成之前不要阻塞。


查看完整回答
反对 回复 2019-07-25
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

Parallel.ForEach将优化(甚至可能不启动新线程)并阻塞直到循环结束,Task.Factory将为每个项显式创建一个新的任务实例,并在它们完成之前返回(异步任务)。Parallel.Foreach效率更高。


查看完整回答
反对 回复 2019-07-25
  • 3 回答
  • 0 关注
  • 1056 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信