WPF绑定线程安全



我有一个TextBox,它绑定到一个属性,在后台线程中以非常快的速度修改。数据绑定在WPF线程安全吗?属性或文本框中的数据是否会不同步?是否有必要(甚至可能)在参与数据绑定的属性上使用同步?

我明白,如果属性所在的类实现了INotifyPropertyChanged,绑定框架会自动将UI更新编组到UI线程。然而,这不是仍然允许数据不同步吗?如果我理解正确的话,从一个线程写入和从另一个线程读取的变量应该是同步的……数据绑定是一个异常吗?

谢谢! !

是的,在大多数情况下。绑定对于单个对象来说是线程安全的(所以对于你的字符串来说应该没问题)。然而,绑定到集合是不是线程安全的——仍然需要手动封送。如果控件绑定到集合,则不能在后台线程上更改集合。

我明白,如果属性所在的类实现了INotifyPropertyChanged,绑定框架会自动将UI更新编组到UI线程。然而,这不是仍然允许数据不同步吗?

不应该失去同步,除非多个线程正在非常快地写入变量(在这种情况下,它们都将阻塞,直到它们恢复同步,但是有一段时间线程将在UI上"等待")。封送处理是同步进行的,因此在绑定更新之前,线程不会接收值。这可能会减慢你的处理速度,因为UI更新必须在后台线程继续之前发生。

是的,它通常是线程安全的。在WPF中(与WinForms不同),数据绑定类查找UI线程的Dispatcher,并使用它(如果需要)自动封送到UI线程。但是请注意,这是同步完成的——当UI被重画时,你的后台线程会阻塞,我看到过这会导致起伏,"冻结"和其他意想不到的快速背景更新效果。

在这里看到一个类似的问题:WPF数据绑定线程安全?

最新更新