在枚举期间添加和删除ConcurrentBag的元素
本文关键字:删除 ConcurrentBag 元素 添加 枚举 | 更新日期: 2023-09-27 18:17:03
当一个线程添加或删除一个ConcurrentBag<T>
的元素,而另一个线程是枚举这个包发生了什么?新元素是否也会出现在枚举中,而删除的元素是否不会出现?
您可以阅读精美的手册来发现:
ConcurrentBag<T>.GetEnumerator
法枚举表示包中内容的某个时刻的快照。它不反映GetEnumerator被调用后对集合的任何更新。该枚举数可以安全地并发地用于对包的读写。
强调我的。
Justin Etheredge有一篇博客文章解释了ConcurrentBag
类的特性:
为了实现线程安全的可枚举对象,GetEnumerator方法返回ConcurrentBag开始迭代时的实时快照。这样,在枚举开始后添加的任何项在遍历数据结构时都不会被看到。
这意味着:当开始枚举ConcurrentBag<T>
时,将创建当前状态的快照。枚举将只显示在枚举开始时袋子中存在的元素。
其他线程仍然可以随意添加和删除元素,但这不会改变枚举所看到的元素集。