并发集合基本查询

时间:2016-01-01 12:41:05

标签: c# concurrent-programming

我有以下情况:
我有一个Parallel.ForEach循环使用自定义分区程序迭代对象集合。分区器获取100个对象的子集并将它们发送到Web服务。返回的结果需要存储在单个集合中。换句话说,Parallel.ForEach的所有迭代都将写入单个集合 我可以使用ConcurrentBag之类的并发集合来存储结果,并确保Parallel.ForEach迭代不会以任何方式改变结果。

感谢
维卡斯

1 个答案:

答案 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>读取),则线程安全会消失。