Я пытаюсь понять эту концепцию, и даже после многих экспериментов я до сих пор не могу понять, что лучше всего использовать с ObservableCollections в WPF и с использованием BindingOperations.EnableCollectionSynchronization.BindingOperations.EnableCollectionSynchronization mystery in WPF
Если у меня есть ViewModel с наблюдаемой коллекцией и включить сбор синхронизацию на нем, используя блокировку, как показано ниже:
m_obsverableCollection = new ObservableCollection<..>;
BindingOperations.EnableCollectionSynchronization(m_obsverableCollection,
m_obsverableCollectionLock);
Означает ли это, что каждая модификация и перечисление над этой наблюдаемой коллекцией будут:
- Заблокировать сбор автоматически, используя m_obsverableCollectionLock?
- Marshall Все изменения в теме, на которой была создана коллекция?
- Marshall Все изменения в теме, на которой был выполнен вызов операции привязки?
При использовании BindingOperations.EnableCollectionSynchronization, мне когда-нибудь понадобится сделать какой-либо блокировки явно?
Проблема, которая породила все это в том, что даже после того, как с помощью BindingOperations.EnableCollectionSynchronization и блокировки элементов, используя тот же замок, я прошел в этот метод, очень редко я получаю «Этот тип CollectionView не поддерживает изменения в его SourceCollection из поток, отличный от потока Диспетчера. " исключение
Можете ли вы опубликовать код, как вы пытаетесь изменить коллекцию и откуда? Я попробовал его в небольшом приложении, и он отлично работает для меня. –
Проблема была прерывистой, поэтому не удалось добавить код для ее воспроизведения. Проблема заключалась в том, что BindingOperations.EnableSynchronization должна выполняться через поток пользовательского интерфейса, иначе существует вероятность исключений, возникающих при доступе к коллекции через потоки неинтерфейса. – Ruskin
. Вы обновляете ObservableCollection в основном потоке пользовательского интерфейса или из фонового потока ? Если из потока bg вы делаете обновление, используя вызов 'Application.Current.Dispatcher.BeginInvoke()'? Вы пробовали этот вызов, используя простой оператор 'lock()' (~ здравомыслие) ...? – code4life