更新并发集合

时间:2016-02-05 10:26:22

标签: c# .net multithreading concurrency concurrent-collections

我正在开发一个多线程应用程序,我从外部源加载数据并将它们存储在内部集合中。 通过再次从外部源加载所有数据,这些集合每X分钟更新一次。 没有其他添加/删除这些集合,只是阅读。

通常我会在更新期间使用锁定,就像我访问集合的所有地方一样。

问题:

在这种情况下,并发收藏会让我的生活更轻松吗? 基本上我看到两种方法

  1. 从外部Feed加载数据,然后删除不再存在的项目,添加缺失的项目,并更新已更改的项目 - 我想这是一个很好的解决方案,可以帮助并发收集(不需要锁定,正确?),但它需要我的代码太多。

  2. 简单地用新的对象覆盖旧的集合对象(例如_data = new ConcurentBag(newData)。在这里我很确定使用并发集合完全没有优势,我是对的吗?需要锁定机制

  3. 我可以使用并发收集的开箱即用解决方案吗?我不想再重新发明轮子。

1 个答案:

答案 0 :(得分:1)

是的,对于并发集合,锁定机制存储在集合中,因此如果您new代替旧集合,那么这就失败了。它们主要用于生产者 - 消费者的情况,通常与BlockingCollection<T>结合使用。如果你的制作人不仅仅​​是添加数据,那么事情会变得更复杂。

使用并发集合的好处是您的锁定机制不再依赖于集合 - 您可以使用object单独的同步lock,以及在关键部分内,你可以自由地分配你想要的另一个实例。

要回答您的问题 - 我不知道任何开箱即用的机制可以做您想做的事情,但我不会使用简单的lock声明拨打电话&# 34;重新发明轮子&#34;。这有点像说使用for循环正在重新发明轮子。只需在非并发集合旁边有一个单独的同步对象。