并发集合基本查询

Concurrent Collection basic query

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

谢谢
维卡斯

我将分别解决你问题的两个部分:

我可以使用像 ConcurrentBag 这样的并发集合来存储结果吗?

是的,ConcurrentBag<T>是专门为支持并发Add/Remove/迭代操作而设计的。如果您在 Parallel.ForEach 委托体内调用 Add,则保证会存储您添加的所有项目 - 尽管它们的确切顺序未定义。

我可以……保证 Parallel.ForEach 次迭代不会以任何方式改变结果吗?

这取决于它究竟是什么 你在你的 Parallel.ForEach 代表体内做了什么。就像我说的,如果你所做的只是将结果存储在 ConcurrentBag<T> 中(通过在你的 Parallel.ForEach 委托中某处调用 Add - 这是最常见的用例),你安全了。

如果您在 Parallel.ForEach 委托中对 ConcurrentBag<T> 执行多个操作(即在写入之前从 ConcurrentBag<T> 中读取),线程安全性会超出 window.