当一个线程正在添加或删除一个元素ConcurrentBag<T>
而另一个线程正在枚举这个包时会发生什么?新元素是否也会出现在枚举中,而删除的元素是否不会出现?
问问题
2997 次
2 回答
6
可以阅读精美的手册来发现:
ConcurrentBag<T>.GetEnumerator
方法枚举表示包内容的即时快照。它不反映调用 GetEnumerator 后对集合的任何更新。枚举器可以安全地与对 bag 的读取和写入同时使用。
强调我的。
于 2013-06-06T01:43:28.790 回答
1
Justin Etheredge 有一篇博客文章解释了ConcurrentBag
该类的特性:
为了将可枚举实现为线程安全的,GetEnumerator 方法返回 ConcurrentBag 的即时快照,就像您开始迭代它时一样。这样,在枚举开始后添加的任何项目在遍历数据结构时都不会被看到。
这意味着:当开始枚举 时ConcurrentBag<T>
,会创建当前状态的快照。枚举将仅显示枚举开始时包中存在的元素。
其他线程仍然可以根据需要添加和删除元素,但这不会改变枚举看到的元素集。
于 2013-06-06T01:36:35.617 回答