我可以在ConcurrentBag上使用正常的foreach吗?

时间:2016-02-08 06:25:25

标签: c# foreach parallel-processing parallel.foreach

在我的代码的并行部分中,我将每个线程的结果保存到ConcurrentBag。但是,当这完成后,我需要遍历每个结果并通过我的评估算法运行它们。普通的foreach是否会遍历所有成员,还是需要特殊代码?我还想过使用像队列而不是包的东西,但我不知道哪个最好。行李通常在并行代码的末尾只包含20个左右的项目。

即,实际上是否会为ConcurrentBag的所有成员访问和运行foreach?

ConcurrentBag futures = new ConcurrentBag();
foreach(move in futures)
{
 // stuff
}

2 个答案:

答案 0 :(得分:5)

您不需要特殊代码,C#的foreach将调用“GetEnumerator”which gives you a snapshot

  

枚举的项目代表了一个时刻的快照   包的内容。它不反映对集合的任何更新   在调用GetEnumerator之后。

答案 1 :(得分:1)

您可以在ConcurrentBag上使用普通的ForEach,但它不会产生任何性能影响。

这与在列表中使用ForEach类似。

为了获得更好的性能,请在ConcurrentBag上使用Parallel.Foreach。

Parallel.ForEach(futures,move=> doOperation;);

仅当您想要执行多线程操作时才使用ConcurrentBag。