如何解决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 举报,一经查实,本站将立刻删除。