Безопасность WPF по защите данных?
Ну, скажем, у меня есть объект, с которым я привязываю данные, он реализует INotifyPropertyChanged, чтобы сообщить графическому интерфейсу, когда значение изменилось...
если я вызываю это из другого потока, кроме потока GUI, как будет выглядеть wpf?
и будет ли он уверен, что он получает значение свойства из памяти, а не кэш-памяти процессора?
более или менее im спрашивает, блокирует ли wpf() объект, содержащий свойство...
Ответы
Ответ 1
Изменения значения, инициированные INotifyPropertyChanged
, автоматически сортируются на диспетчере. (http://blog.lab49.com/archives/1166)
Огоньте это событие в любом потоке, который вам нравится...
Изменения значения, произведенные с помощью INotifyCollectionChanged
, на диспетчере НЕ надежно сортируются. (http://csharplive.wordpress.com/2008/09/11/wpf-data-binding-observablecollection-cross-thread-binding-support/)
Если вам нужно обновить наблюдаемую коллекцию из другого потока, следуйте советам по этой ссылке
Ответ 2
В дополнение к ответу @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/
Ответ 3
На практике это работает как ожидалось и кажется потокобезопасным (не видели ничего странного или исключения из-за обновления в фоновом потоке). Я считаю, что при необходимости он обращается к потоку пользовательского интерфейса, но я не слишком хорошо знаком с внутренними компонентами.