2011-09-08 51 views
2

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

我明白,如果属性所在的类实现INotifyPropertyChanged,则绑定框架会自动将UI更新封送到UI线程。但是,这不会让数据不同步吗?如果我理解正确,从一个线程写入并从另一个线程读取的变量应该通过同步...数据绑定是一个异常?

谢谢!!

回答

4

是,在大多数情况下。绑定对于单个对象是线程安全的(所以应该对你的字符串适用)。然而,绑定到一个集合是而不是线程安全 - 仍然需要手动编组。如果您有一个绑定到集合的控件,则无法在后台线程上更改该集合。

我明白,如果属性所在的类实现了INotifyPropertyChanged,则绑定框架会自动将UI更新封送到UI线程。但是,这不会让数据不同步吗?

这不应该不同步的,除非多个线程很快写入变量(在这种情况下,他们将所有的块,直到他们回来同步,但有一段时间,其中线程将在用户界面上“等待”)。编组发生同步,因此线程在绑定更新之前不会接收值。这可能会减慢处理速度,因为UI更新必须在后台线程可以继续之前发生。

+0

谢谢,你和克里斯都得到了答案。我没有意识到编组是同步发生的。 –

2

是的,它通常是线程安全的。在WPF中(与WinForms不同),数据绑定类查找UI线程的Dispatcher并使用它(如果需要)自动封送到UI线程。但是,请注意,这是同步完成的 - 当UI重新绘制时,后台线程将会阻塞,并且我已经看到由于快速后台更新导致波动,“冻结”以及其他意想不到的效果。

看到类似的问题在这里:WPF Databinding thread safety?