我有一个TextBox绑定到一个属性,该属性在后台线程中以非常快的速率被修改。 WPF线程中的数据绑定是否安全?属性或TextBox中的数据是否会不同步?是否有必要(甚至可能)在参与数据绑定的属性上使用同步?
据我所知,如果属性所在的类实现了INotifyPropertyChanged,则绑定框架会自动将UI更新封送到UI线程。但是,是否仍然允许数据不同步?如果我理解正确,从一个线程写入并从另一个线程读取的变量应该通过synchronized ...是绑定异常的数据吗?
谢谢!
答案 0 :(得分:5)
是的,大部分时间。绑定对于单个对象是线程安全的(因此对于您的字符串应该没问题)。但是,绑定到集合不线程安全 - 仍然需要手动封送。如果控件绑定到集合,则无法在后台线程上更改集合。
据我所知,如果属性所在的类实现了INotifyPropertyChanged,则绑定框架会自动将UI更新封送到UI线程。但是,这仍然不允许数据不同步吗?
这应该不会失去同步,除非多个线程非常快速地写入变量(在这种情况下,它们都将阻塞,直到它们恢复同步,但是有一段时间线程会“等待“在UI上”。编组同步发生,因此在绑定是最新的之前,线程不会接收值。这会降低您的处理速度,因为在您的后台线程可以继续之前必须进行UI更新。
答案 1 :(得分:3)
是的,它通常是线程安全的。在WPF(与WinForms不同)中,数据绑定类查找UI线程的Dispatcher并使用它(如果需要)自动封送到UI线程。但请注意,这是同步完成的 - 在重新绘制UI时,后台线程会阻塞,我已经看到这会导致波动,“冻结”以及其他意外影响,并且会有快速的后台更新。
在此处查看类似问题:WPF Databinding thread safety?