我一直在努力理解这个概念,即使经过多次实验,我仍然无法弄清楚 WPF 中的 ObservableCollections 和使用 BindingOperations.EnableCollectionSynchronization 的最佳实践是什么。
如果我有一个带有可观察集合的 View 模型,并且我使用锁在其上启用了集契约(Contract)步,如下所示:
m_obsverableCollection = new ObservableCollection<..>;
BindingOperations.EnableCollectionSynchronization(m_obsverableCollection,
m_obsverableCollectionLock);
这是否意味着对该可观察集合的每次修改和枚举都将:
- 使用 m_obsverableCollectionLock 自动锁定集合?
- 在创建集合的线程上整理所有修改?
- 在调用绑定(bind)操作的线程上整理所有修改?
使用 BindingOperations.EnableCollectionSynchronization 时,我是否需要显式进行任何类型的锁定?
产生这一切的问题是,即使在使用 BindingOperations.EnableCollectionSynchronization 并使用我传递给该方法的相同锁锁定项目之后,我偶尔也会收到 “这种类型的 CollectionView 不支持更改其 SourceCollection来自与 Dispatcher 线程不同的线程。” 异常
最佳答案
我们终于追根究底了:
我们必须在调度程序上启用 CollectionSynchronization:
Application.Current.Dispatcher.BeginInvoke(new Action(()=>
{
BindingOperations.EnableCollectionSynchronization(m_obsverableCollection, m_observableCollectionLock);
}));
然后每当任何其他线程想要访问可观察对象时,您可以简单地:
lock (m_observableCollectionLock)
m_observableCollection.Add(...)
关于c# - WPF 中的 BindingOperations.EnableCollectionSynchronization 之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19734782/