WPF Databinding Thread Safety? - PullRequest
       4

WPF Databinding Thread Safety?

28 голосов
/ 31 марта 2010

Хорошо, скажем, у меня есть объект, к которому я привязал данные, он реализует INotifyPropertyChanged, чтобы сообщить GUI, когда значение изменилось ...

Если бы я вызвал это из потока, отличного от потока GUI, как бы вел себя wpf?

и убедится ли он, что он получает значение свойства из памяти, а не из кэша процессора?

более или менее я спрашиваю, действительно ли wpf блокирует () объект, содержащий свойство ...

Ответы [ 3 ]

40 голосов
/ 31 марта 2010

Изменения значений, вызванные INotifyPropertyChanged , автоматически направляются обратно в диспетчер. (http://blog.lab49.com/archives/1166)

Запустить это событие в любой теме, которая вам нравится ...


Изменения значений, вызванные INotifyCollectionChanged , НЕ надежно направляются в диспетчер. (http://csharplive.wordpress.com/2008/09/11/wpf-data-binding-observablecollection-cross-thread-binding-support/)

Если вам нужно обновить наблюдаемую коллекцию из другой ветки, следуйте советам по этой ссылке

3 голосов
/ 06 апреля 2015

В дополнение к ответу @Rob Fonseca-Ensor для тех, кому посчастливилось использовать WPF4.5, есть несколько хороших новостей:

WPF позволяет получать доступ и изменять коллекции данных в потоках, отличных от того, который создал коллекцию. Это позволяет использовать фоновый поток для получения данных из внешнего источника, такого как база данных, и отображения данных в потоке пользовательского интерфейса. Используя другой поток для изменения коллекции, ваш пользовательский интерфейс остается реагирующим на взаимодействие с пользователем. (https://msdn.microsoft.com/en-us/library/bb613588(v=vs.110).aspx#xthread_access)

Есть полезное резюме Джонатана Антуана: http://www.jonathanantoine.com/2011/09/24/wpf-4-5-part-7-accessing-collections-on-non-ui-threads/

0 голосов
/ 31 марта 2010

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

...