2

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

4

2 回答 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 回答