并发集合基本查询
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.
我有以下场景:
我有一个 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.