更新并发集合
Updating concurrent collection
我正在开发一个多线程应用程序,我从外部提要加载数据并将它们存储在内部集合中。
通过再次从外部提要加载所有数据,这些集合每 X 分钟更新一次。
这些合集中没有其他adding/removing,只是阅读。
通常我会在更新期间使用锁定,就像我访问集合的任何地方一样。
问题:
在这种情况下,并发收集是否让我的生活更轻松?
基本上我看到两种方法
从外部提要加载数据,然后删除不再存在的项目,添加缺失的,并更新更改的 - 我想这是一个在并发收集帮助下的好解决方案(没有需要锁定,对吗?),但它需要我这边的代码太多。
简单地用一个新的覆盖旧的集合对象(例如_data = new ConcurentBag(newData))。在这里我很确定使用并发集合没有任何优势,对吗?需要锁定机制。
是否有我可以使用并发集合的现成解决方案?我不想重新发明轮子。
是的,对于并发集合,锁定机制存储在集合内部,因此如果您 new
建立一个集合来代替旧集合,那只会破坏目的。它们主要用于生产者-消费者的情况,通常与 BlockingCollection<T>
结合使用。如果您的生产者所做的不仅仅是添加数据,这会使事情变得更加复杂。
不 使用并发集合的好处是您的锁定机制不再依赖于集合 - 您可以有一个单独的同步 object
lock
在关键部分和内部,您可以随意分配另一个实例。
回答你的问题——我不知道有什么开箱即用的机制可以做你想做的事,但我不会使用简单的 lock
语句 "reinventing the wheel".这有点像说使用 for
循环是在重新发明轮子。只需在非并发集合旁边有一个单独的同步对象。
我正在开发一个多线程应用程序,我从外部提要加载数据并将它们存储在内部集合中。 通过再次从外部提要加载所有数据,这些集合每 X 分钟更新一次。 这些合集中没有其他adding/removing,只是阅读。
通常我会在更新期间使用锁定,就像我访问集合的任何地方一样。
问题:
在这种情况下,并发收集是否让我的生活更轻松? 基本上我看到两种方法
从外部提要加载数据,然后删除不再存在的项目,添加缺失的,并更新更改的 - 我想这是一个在并发收集帮助下的好解决方案(没有需要锁定,对吗?),但它需要我这边的代码太多。
简单地用一个新的覆盖旧的集合对象(例如_data = new ConcurentBag(newData))。在这里我很确定使用并发集合没有任何优势,对吗?需要锁定机制。
是否有我可以使用并发集合的现成解决方案?我不想重新发明轮子。
是的,对于并发集合,锁定机制存储在集合内部,因此如果您 new
建立一个集合来代替旧集合,那只会破坏目的。它们主要用于生产者-消费者的情况,通常与 BlockingCollection<T>
结合使用。如果您的生产者所做的不仅仅是添加数据,这会使事情变得更加复杂。
不 使用并发集合的好处是您的锁定机制不再依赖于集合 - 您可以有一个单独的同步 object
lock
在关键部分和内部,您可以随意分配另一个实例。
回答你的问题——我不知道有什么开箱即用的机制可以做你想做的事,但我不会使用简单的 lock
语句 "reinventing the wheel".这有点像说使用 for
循环是在重新发明轮子。只需在非并发集合旁边有一个单独的同步对象。