在枚举期间添加和删除ConcurrentBag的元素

本文关键字:删除 ConcurrentBag 元素 添加 枚举 | 更新日期: 2023-09-27 18:17:03

当一个线程添加或删除一个ConcurrentBag<T>的元素,而另一个线程是枚举这个包发生了什么?新元素是否也会出现在枚举中,而删除的元素是否不会出现?

在枚举期间添加和删除ConcurrentBag的元素

您可以阅读精美的手册来发现:

ConcurrentBag<T>.GetEnumerator

枚举表示包中内容的某个时刻的快照。它不反映GetEnumerator被调用后对集合的任何更新。该枚举数可以安全地并发地用于对包的读写。

强调我的。

Justin Etheredge有一篇博客文章解释了ConcurrentBag类的特性:

为了实现线程安全的可枚举对象,GetEnumerator方法返回ConcurrentBag开始迭代时的实时快照。这样,在枚举开始后添加的任何项在遍历数据结构时都不会被看到。

这意味着:当开始枚举ConcurrentBag<T>时,将创建当前状态的快照。枚举将只显示在枚举开始时袋子中存在的元素。

其他线程仍然可以随意添加和删除元素,但这不会改变枚举所看到的元素集。