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

时间:2013-06-06 01:36:36

标签: c# concurrency

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

2 个答案:

答案 0 :(得分:5)

可以read the fine manual发现:

  

ConcurrentBag<T>.GetEnumerator方法

     

枚举表示行李内容的即时快照。 在调用GetEnumerator后,它不会反映对集合的任何更新。该枚举器可以安全地同时使用读取和写入包

强调我的。

答案 1 :(得分:1)

Justin Etheredge有blog post解释ConcurrentBag类的功能:

  

为了将可枚举实现为线程安全,GetEnumerator方法返回ConcurrentBag的时刻快照,就像您开始迭代它时一样。这样,迭代数据结构时将不会看到在枚举开始后添加的任何项目。

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

其他线程仍然可以根据需要添加和删除元素,但这不会更改枚举所见的元素集。