我的一个项目中有ObservableCollection<T>
,我需要提供线程安全访问权限。
特别是,我需要一个线程安全的枚举器。这意味着,在迭代集合期间(例如在LINQ查询期间),没有人应该能够添加项目。
我注意到.NET 4.0命名空间System.Collections.Concurrent
中的类。但是它们似乎都没有匹配。另外,在MSDN doc中,我没有找到关于哪些访问实际 线程安全的段落。
我可以使用某个现有的线程安全集合,或者我必须自己实现吗?
答案 0 :(得分:5)
请记住,如果你在GetEnumerator
方法中取出锁,你可能会持有很长时间的锁定,在此期间没有人能够将对象添加到你的收藏中:< / p>
foreach (var o in myCollection) {
// Do something that takes 10 minutes
}
如果多次迭代同时发生,您还需要考虑会发生什么。这意味着某种MRSW锁定(多个读取器单个写入器),您可能必须自己实现。
听起来你真正需要做的是迭代集合的快照:
foreach (var o in myCollection.ToArray()) {
// ...
}
要正确执行此操作,您需要实施自己的ICollection<T>
,以便锁定ToArray
和Add
方法
如果您更准确地提出要求或规范,可能会有所帮助。
答案 1 :(得分:0)
ObservableCollection不是线程安全的。在它上面实现你自己的线程安全包装。