【发布时间】:2017-05-11 20:27:49
【问题描述】:
MSDN 声明从字典返回的枚举器不代表字典的即时快照。虽然在多线程环境中很少需要它,但如果需要,获取 ConcurrentDictionary 的即时快照的最佳方法是什么?
【问题讨论】:
-
如何为可以在多个线程上并行更改的集合定义“即时”快照?遍历集合以收集组成它的项目需要时间,并且在此期间它可能已经被修改。这样做并非不可能,但它相当复杂,
ConcurrentDictionary不会这样做。 -
@xxbbcc 请参见
GetEnumerator()代码ConcurrentBag<T>、ConcurrentQueue<T>或ConcurrentStack<T>,它们都提供了枚举器的即时快照。 -
@ScottChamberlain 您的 BlockignCollection 提案仍然无法及时为您提供快照。在取出一项后,字典的其他用户可能会删除一项(或添加一个新项),从而弄乱您的迭代器。
-
@IvanStoev 对于 ConcurrentDictionary 它没有,对于其他类型它有。这就是斯科特的观点。
-
@Ramy 随意询问课程的开发人员为什么按他们的方式设计它。
标签: c# multithreading concurrentdictionary