WPF DataBinding Thread Safety - PullRequest
       5

WPF DataBinding Thread Safety

3 голосов
/ 08 сентября 2011

У меня есть TextBox, привязанный к свойству, которое очень быстро изменяется в фоновом потоке.Безопасна ли привязка данных в потоке WPF?Будут ли данные в свойстве или TextBox когда-либо не синхронизированы?Необходимо ли (или даже возможно) использовать синхронизацию для свойства, которое участвует в связывании данных?

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

спасибо !!

Ответы [ 2 ]

5 голосов
/ 08 сентября 2011

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

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

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

3 голосов
/ 08 сентября 2011

Да, это обычно потокобезопасно. В WPF (в отличие от WinForms) классы привязки данных ищут в потоке пользовательского интерфейса Dispatcher и используют его (при необходимости) для автоматического маршалинга в поток пользовательского интерфейса. Однако обратите внимание, что это делается синхронно - ваш фоновый поток будет блокироваться, пока пользовательский интерфейс перерисовывается, и я видел, что это вызывает неустойчивость, «зависание» и другие непреднамеренные эффекты с быстрыми обновлениями фона.

См. Аналогичный вопрос здесь: WPF Databinding thread Safety?

...