Mar*_*cel 1 c# collections concurrency observablecollection thread-safety
我有一个ObservableCollection<T>项目,我需要使访问线程安全.
特别是,我需要一个线程安全的枚举器.这意味着,在迭代集合期间(例如在LINQ查询期间),没有人应该能够添加项目.
我注意到.NET 4.0命名空间中的类System.Collections.Concurrent.但是它们似乎都没有匹配.另外,在MSDN文档中,我没有找到关于哪些访问实际上是线程安全的段落.
在某个地方是否有现有的线程安全集合,我可以使用,还是我必须自己实现?
请记住,如果你在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>方法来锁定ToArray和Add方法
如果您更准确地提供您的要求或规范,它可能会有所帮助.
| 归档时间: |
|
| 查看次数: |
1467 次 |
| 最近记录: |