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

3
当一个线程正在添加或删除ConcurrentBag<T>的元素,而另一个线程正在枚举此包时,会发生什么情况?新元素也会在枚举中显示吗?已删除的元素不会出现吗?
2个回答

7

有人可以阅读精细手册以了解:

ConcurrentBag<T>.GetEnumerator 方法

枚举表示包内容的瞬时快照。它不反映在调用 GetEnumerator 之后对集合所做的任何更新。该枚举器可安全地与从包中读取和写入并发使用

重点标记为我的。


1
Justin Etheredge撰写了一篇博客文章,解释了ConcurrentBag类的特点:
为了实现可枚举的线程安全性,GetEnumerator方法返回ConcurrentBag的瞬时快照,此快照是在开始迭代时创建的。这样,当在数据结构上进行迭代时,添加到其中的任何项都不会被看到。
这意味着:当开始枚举ConcurrentBag<T>时,将创建当前状态的快照。枚举将只显示在枚举开始时存在于包中的元素。
其他线程仍然可以随意添加和删除元素,但这不会改变枚举所看到的元素集。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接