gpt4 book ai didi

c# - 使用安全枚举在 C# 4.0 中线程安全地替换 ObservableCollection

转载 作者:太空宇宙 更新时间:2023-11-03 20:38:22 25 4
gpt4 key购买 nike

我有一个 ObservableCollection<T>在我的一个项目中,我需要使访问线程安全。
特别是,我需要一个线程安全的枚举器。这意味着,在遍历集合期间(例如,在 LINQ 查询期间),任何人都不能添加项目。

我注意到 .NET 4.0 命名空间中的类 System.Collections.Concurrent .但是,它们似乎都不匹配。另外,在 MSDN doc ,我没有找到关于哪些访问实际上是 线程安全的段落。

是否有我可以使用的现有线程安全集合,或者我必须自己实现它?

最佳答案

请记住,如果您在 GetEnumerator 中取出一把锁方法,您可能会持有锁很长时间,在此期间没有人能够将对象添加到您的集合中:

foreach (var o in myCollection) {
// Do something that takes 10 minutes
}

您还需要考虑如果同时发生多个迭代会发生什么情况。这意味着您可能必须自己实现某种 MRSW 锁(多读单写)。

听起来您实际需要做的是迭代集合的快照:

foreach (var o in myCollection.ToArray()) {
// ...
}

要正确执行此操作,您需要实现自己的 ICollection<T>取出 ToArray 中的锁和 Add方法

如果您更准确地给出您的要求或规范,这可能会有所帮助。

关于c# - 使用安全枚举在 C# 4.0 中线程安全地替换 ObservableCollection<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4144906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com