在我的代码的并行部分中,我将每个线程的结果保存到ConcurrentBag。但是,当这完成后,我需要遍历每个结果并通过我的评估算法运行它们。普通的foreach是否会遍历所有成员,还是需要特殊代码?我还想过使用像队列而不是包的东西,但我不知道哪个最好。行李通常在并行代码的末尾只包含20个左右的项目。
即,实际上是否会为ConcurrentBag的所有成员访问和运行foreach?
ConcurrentBag futures = new ConcurrentBag();
foreach(move in futures)
{
// stuff
}
答案 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。