當另一個線程正在枚舉此包時,線程添加或刪除ConcurrentBag<T>
的元素時會發生什麼?這些新元素是否也會在枚舉中出現,並且刪除的元素是否會顯示出來?在枚舉過程中添加和刪除ConcurrentBag的元素
1
A
回答
5
人們可以read the fine manual發現:
ConcurrentBag<T>.GetEnumerator
方法枚舉代表的包裏的瞬間即時快照。 在調用GetEnumerator之後它並不反映對集合的任何更新。該枚舉器可以安全地同時使用讀取和寫入包。
強調我的。
1
賈斯汀Etheredge有ConcurrentBag
類的blog post解釋特點:
爲了實現可枚舉的線程安全的,GetEnumerator方法返回ConcurrentBag的時刻即時快照,因爲它當你開始迭代它時。通過這種方式,枚舉開始後添加的任何項在迭代數據結構時都不會被看到。
這意味着:當開始枚舉ConcurrentBag<T>
時,會創建當前狀態的快照。枚舉將只顯示枚舉開始時袋中的元素。
其他線程仍然可以添加和刪除元素,但它們不會更改枚舉所看到的元素集。
相關問題
- 1. 枚舉hashset並從中刪除元素
- 2. 如何在枚舉過程中刪除NSMutableArray或NSMutableDictionary中的元素?
- 3. 添加和刪除元素
- 4. 在枚舉過程中元素可能被刪除時枚舉集合的最佳方法
- 5. 線程安全枚舉,在c中添加或刪除集合#
- 6. 在python中使用枚舉()時從列表中刪除元素
- 7. 跳過枚舉Java中的元素
- 8. 在Plot.ly的圖上動畫添加和/或刪除元素動畫添加和/或刪除圖中的元素
- 9. 在枚舉數組時通過動態刪除數組中的元素
- 10. XSD元素和枚舉
- 11. 再次添加,刪除和添加元素刪除其事件
- 12. 添加和刪除jquery上的元素
- 13. 通過onclick添加/刪除元素
- 14. 添加/刪除子元素
- 15. 將枚舉中的所有元素添加到ArrayList中
- 16. 枚舉陣列時從陣列中刪除元素
- 17. 添加和刪除元素序列
- 18. 使用HtmlUnit添加和刪除元素
- 19. 添加和刪除文本框元素
- 20. 在動畫過程中刪除元素
- 21. 如何刪除每個枚舉器返回的元素?
- 22. 如何在C#中的CharArray中刪除和添加元素?
- 23. 加速枚舉過程
- 24. jquery通過元素列表添加和刪除類的順序
- 25. 添加和刪除html元素的事件處理程序
- 26. xml元素枚舉屬性和枚舉值
- 27. 如何通過XSLT刪除和添加選擇元素?
- 28. 使用LINQ添加和刪除XDocument元素及其子元素
- 29. 添加和刪除類元素子元素
- 30. 找出元素是否在枚舉中