【问题标题】:Concurrent Collection basic query并发集合基本查询
【发布时间】:2016-01-01 21:13:38
【问题描述】:

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

谢谢
维卡斯

【问题讨论】:

  • 是的,并发包非常适合这个。
  • 感谢约翰的快速回复。

标签: c# concurrent-programming


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 我们只是将结果转储到并发包中,一旦所有迭代完成,就一次性处理结果。所以这只是对 Add 的调用。
  • @Vikas,这正是 ConcurrentBag<T> 的设计目的,所以你很安全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 2017-12-04
  • 2012-12-20
相关资源
最近更新 更多