我有以下情况:
我有一个Parallel.ForEach循环使用自定义分区程序迭代对象集合。分区器获取100个对象的子集并将它们发送到Web服务。返回的结果需要存储在单个集合中。换句话说,Parallel.ForEach的所有迭代都将写入单个集合
我可以使用ConcurrentBag之类的并发集合来存储结果,并确保Parallel.ForEach迭代不会以任何方式改变结果。
感谢
维卡斯
答案 0 :(得分:1)
我将分别解决您问题的两个部分:
我可以使用ConcurrentBag这样的并发集合来存储结果吗?
是的,ConcurrentBag<T>
专门用于支持并发Add
/ Remove
/迭代操作。如果您在Add
委托机构内部调用Parallel.ForEach
,则保证您添加的所有项目都会被存储 - 尽管它们的确切顺序未定义。
我能确定Parallel.ForEach迭代不会以任何方式改变结果吗?
这取决于你在Parallel.ForEach
委托机构中所做的究竟是什么。就像我说的那样,如果您所做的一切都是将结果存储在ConcurrentBag<T>
(通过致电Add
代表某处Parallel.ForEach
- 那就是最常见的用例),你是安全的。
如果您在ConcurrentBag<T>
代表内的Parallel.ForEach
上执行多项操作(即在写入之前从ConcurrentBag<T>
读取),则线程安全会消失。