使用安全枚举在C#4.0中线程安全地替换ObservableCollection <T>

Mar*_*cel 1 c# collections concurrency observablecollection thread-safety

我有一个ObservableCollection<T>项目,我需要使访问线程安全.
特别是,我需要一个线程安全的枚举器.这意味着,在迭代集合期间(例如在LINQ查询期间),没有人应该能够添加项目.

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

在某个地方是否有现有的线程安全集合,我可以使用,还是我必须自己实现?

the*_*oop 5

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

foreach (var o in myCollection) {
    // Do something that takes 10 minutes
}
Run Code Online (Sandbox Code Playgroud)

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

听起来你真正需要做的是迭代集合的快照:

foreach (var o in myCollection.ToArray()) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

要正确地执行此操作,您需要实现自己的ICollection<T>方法来锁定ToArrayAdd方法

如果您更准确地提供您的要求或规范,它可能会有所帮助.