我一直在努力理解这个概念,即使经过许多实验,我仍然无法弄清楚WPF中的ObservableCollections和使用BindingOperations.EnableCollectionSynchronization的最佳实践是什么。
如果我有一个带有可观察集合的viewmodel,并使用锁启用了它的集契约(Contract)步,如下所示:
m_obsverableCollection = new ObservableCollection<..>;
BindingOperations.EnableCollectionSynchronization(m_obsverableCollection,
m_obsverableCollectionLock);
这是否意味着对该可观察集合的所有修改和枚举将:
使用BindingOperations.EnableCollectionSynchronization时,我是否需要显式地进行任何锁定?
产生所有这一切的问题是,即使在使用BindingOperations.EnableCollectionSynchronization和使用与我传递给该方法的锁相同的项锁定项目之后,我偶尔也会收到“这种CollectionView不支持从不同于该线程的线程对其SourceCollection进行更改。调度程序线程。”异常(exception)
最佳答案
我们终于找到了底线:
我们必须在调度程序上启用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/