INotifyPropertyChanged: что происходит за кулисами? - PullRequest
6 голосов
/ 04 сентября 2010

В WPF у нас есть два потока (по крайней мере): рендеринг и поток пользовательского интерфейса.Когда я вызываю событие OnNotifyPropertyChanged при некоторых изменениях свойств, оно возникает в потоке пользовательского интерфейса.Эта информация должна быть отправлена ​​потоку рендеринга WPF для повторного рендеринга.Я предполагаю, что это делается синхронно (Dispatcher.Invoke), но как это на самом деле работает?

Если я вызову несколько событий OnNotifyPropertyChanged для одной и той же структуры данных без блокировки доступа к свойству метода доступа для этой структуры данных, для которой были созданы эти события, я создаю потенциальное состояние гонки?Я видел печально известное исключение «Коллекция; операция перечисления может не выполняться», происходящее из WPF, поэтому похоже, что WPF обрабатывает эти события асинхронно.Я неправильно понимаю исключение?Спасибо!

Ответы [ 3 ]

1 голос
/ 07 сентября 2010

Исключение «Коллекция была изменена; операция перечисления может не выполняться» не относится к WPF, оно вызывается из IEnumerator, когда вы выполняете итерацию в коллекции с помощью foreach и при этом коллекция каким-то образом изменяется (добавляется / удаляется / изменяется).(Например: http://social.msdn.microsoft.com/forums/en/netfxbcl/thread/7ce02724-2813-4f7d-8f3c-b1e3c1fd3019/).

Кроме этого, я никогда не сталкивался с исключением, вызванным несколькими одновременными вызовами события PropertyChanged.

0 голосов
/ 09 сентября 2010

Вы занимаетесь обработкой себя в потоке без интерфейса?Я вполне уверен, что итерация любых перечислений, к которым вы привязываете, будет выполнена в потоке пользовательского интерфейса, поэтому, если после того, как вы вызовете событие, кто-то еще в вашем приложении изменит коллекцию, вы получите это исключение.проблема не должна быть вызвана тем, что поток рендеринга перебирает вашу коллекцию, поскольку он этого никогда не делает.

0 голосов
/ 04 сентября 2010

Надеюсь, когда вы обновляете два потока, вы обновляете

  1. Рендеринг потока
  2. Нить пользовательского интерфейса.

Да, вы правы, обновление являетсяASYNCH

Взгляните на http://msdn.microsoft.com/en-us/magazine/cc163328.aspx

...