【问题标题】:iterating through ConcurrentDictionary and modifying the collection遍历 ConcurrentDictionary 并修改集合
【发布时间】:2014-10-23 10:41:20
【问题描述】:

遍历 ConcurrentDictionary 集合并删除一些条目的正确方法是什么。

据我了解,ConcurrentDictionary 实现了对单元格级别的锁定,对我而言,遍历整个集合并通过某些条件删除不相关的数据很重要。我担心通过我的迭代,其他线程将添加应该在我的迭代器在集合中的那个点之后过滤的数据。

那么我如何使用 ConcurrentDictionary 来实现这一点,或者应该在该集合的每次触摸上使用具有锁定机制的普通字典。

谢谢。

【问题讨论】:

    标签: c# .net concurrentdictionary


    【解决方案1】:

    ConcurrentDictionary IMO 的主要优势在于它是lock free for the reading threads,这通常是您使用它的原因;如果您不需要这种优势,那么您可以使用带锁的字典。

    您始终可以确保将过滤条件传递给过滤器迭代开始后发生的任何添加。

    否则,如果非阻塞读取比偶尔的不一致条目更重要,您可以重复您的过滤器,直到它找不到更多无效条目。

    【讨论】:

      【解决方案2】:

      你不能保证,当你在不锁定字典的情况下迭代它时,不会向ConcurrentDictionary 添加任何条目。但是如果做加锁,那么使用ConcurrentDictionary就没有意义了,改用Dictionary吧。

      顺便说一句,为什么在没有留下任何“坏”条目的情况下结束迭代对您来说很重要?在释放锁后的下一刻,它可以填充其中任何一个。也许最好不要让不需要的条目出现在字典中?

      【讨论】:

      • 这和我应该遵循的外部业务逻辑有关。
      • 好的,然后锁定Dictionary 并对其进行迭代。我在这里看不到其他选择。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-11
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      相关资源
      最近更新 更多