代码之家  ›  专栏  ›  技术社区  ›  Viking22

并发集合基本查询

  •  0
  • Viking22  · 技术社区  · 10 年前

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

    谢谢
    维卡斯

    1 回复  |  直到 10 年前
        1
  •  1
  •   Kirill Shlenskiy    10 年前

    我将分别回答您问题的两部分:

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

    对 ConcurrentBag<T> 专为支持并发 Add / Remove /迭代操作。如果你打电话 添加 在 Parallel.ForEach 委托体中,您添加的所有项都保证被存储,尽管它们的确切顺序未定义。

    我能…确信平行线。ForEach迭代不会以任何方式改变结果?

    这取决于 它到底是什么 你在你的 并行循环 代理主体。就像我说的,如果你所做的只是将结果存储在 并发包<T> (通过致电 添加 在你的某处 并行循环 委托-这是最常见的用例),你是安全的。

    如果要对执行多个操作 并发包<T> 在您的 并行循环 委托(即从 并发包<T> 在你写之前),线程安全性就会消失。