【发布时间】:2012-04-09 17:25:25
【问题描述】:
在多线程应用程序中首选: Dictionary 带锁对象 要么 Concurrency Dictionary
哪一种有效,我为什么要使用其中一种?
编辑 1:将 Guid 存储为键和 bool 作为值。
编辑 2:超过 2 个工作线程和一个 UI 线程。
【问题讨论】:
-
这将在很大程度上取决于情况。
标签: c# .net concurrency dictionary
在多线程应用程序中首选: Dictionary 带锁对象 要么 Concurrency Dictionary
哪一种有效,我为什么要使用其中一种?
编辑 1:将 Guid 存储为键和 bool 作为值。
编辑 2:超过 2 个工作线程和一个 UI 线程。
【问题讨论】:
标签: c# .net concurrency dictionary
我会说你有以下选择。
一些新的 Framework 4.0 类:
所有新的 4.0 类运行速度更快,但具有 levanovd 提到的一些特性。这些类的性能比较你可以找到here。
早期版本的一些经典解决方案:
如果我对使用 Framework v3.5 有限制,我会使用 Dictionary + ReaderWriterLock 或 ReaderWriterLockSlim。
【讨论】:
仔细阅读ConcurrentDictionary。它有一些不明显的特点。
以下是其中的一些:
AddOrUpdate,则无法保证将调用哪个工厂委托,甚至无法保证工厂委托是否会生成某个项目,该项目将存储在字典中。GetEnumerator 调用获得的枚举器不是快照,可以在枚举期间修改(不会导致任何异常)。Keys 和 Values 属性是对应集合的快照,可能与实际字典状态不对应。所以请再次阅读ConcurrentDictionary 并确定此行为是否是您所需要的。
希望这会有所帮助!
【讨论】:
我认为两者都将提供线程安全,但使用带有锁对象的 Dictionary 会将可以同时访问 Dictionary 的线程数限制为 1。使用 Concurrent Dictionary 时,您可以指定并发级别(即可以同时访问字典)。如果性能确实很重要,我相信并发字典应该是您的选择。
【讨论】:
当您使用锁定对象实现字典时,您主要关心的是线程安全。所以看起来,concurrentDictionary 已经解决了这个问题。我认为重新发明轮子是没有意义的。
【讨论】: