当一个线程正在添加或删除ConcurrentBag<T>
的元素而另一个线程正在枚举此包时会发生什么?新元素是否也会显示在枚举中,并且删除的元素是否会显示?
答案 0 :(得分:5)
可以read the fine manual发现:
ConcurrentBag<T>.GetEnumerator
方法枚举表示行李内容的即时快照。 在调用GetEnumerator后,它不会反映对集合的任何更新。该枚举器可以安全地同时使用读取和写入包。
强调我的。
答案 1 :(得分:1)
Justin Etheredge有blog post解释ConcurrentBag
类的功能:
为了将可枚举实现为线程安全,GetEnumerator方法返回ConcurrentBag的时刻快照,就像您开始迭代它时一样。这样,迭代数据结构时将不会看到在枚举开始后添加的任何项目。
这意味着:当开始枚举ConcurrentBag<T>
时,会创建当前状态的快照。枚举将仅显示枚举开始时包中存在的元素。
其他线程仍然可以根据需要添加和删除元素,但这不会更改枚举所见的元素集。