微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Parallel.ForEach 与 Task.Factory.StartNew

如何解决Parallel.ForEach 与 Task.Factory.StartNew

一个是更好的选择。

Parallel.ForEach 在内部使用 aPartitioner<T>将您的集合分发到工作项中。它不会对每个项目执行一项任务,而是将其批处理以降低所涉及的开销。

Task第二个选项将为您的收藏中的每个项目安排一个。虽然结果将(几乎)相同,但这将引入比必要更多的开销,尤其是对于大型集合,并导致整体运行时变慢。

仅供参考 - 如果需要,可以通过对 Parallel.ForEach 使用适当的重载来控制使用的分区器。有关详细信息,请参阅MSDN 上的自定义分区器。

在运行时,主要区别在于第二个将异步执行。这可以通过执行以下操作使用 Parallel.ForEach 复制:

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

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

解决方法

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

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

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

vs

foreach(var item in items)
{
  Task.Factory.StartNew(() => DoSomething(item));
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。