WPF数据绑定线程安全

3
我有一个TextBox与一个属性绑定,该属性在后台线程中以非常快的速度进行修改。WPF数据绑定是线程安全的吗?属性或TextBox中的数据是否会出现不同步的情况?在参与数据绑定的属性上使用同步是必要的(甚至可能)吗?
我知道如果包含该属性的类实现了INotifyPropertyChanged接口,则绑定框架会自动将UI更新调用到UI线程。然而,这是否仍允许数据失去同步?如果我理解正确,则从一个线程写入并从另一个线程读取的变量应该同步...数据绑定是否为例外?
谢谢!
2个回答

5
大部分情况下是可以的。对于单个对象,绑定是线程安全的(所以对于您的字符串应该没问题)。但是,绑定到集合不是线程安全的,并且仍然需要手动编排。如果一个控件绑定到一个集合,您不能在后台线程上更改该集合。
我知道,如果属性所在的类实现了INotifyPropertyChanged,绑定框架会自动将UI更新编排到UI线程。但是,这样做是否仍然允许数据失步?
这不应该失步,除非多个线程非常快地写入变量(在这种情况下,它们都会被阻塞,直到它们重新同步,但是有一段时间线程将“等待”UI)。编排发生同步,因此线程在绑定更新到位之前不会接收到值。这可能会减慢处理速度,因为必须在后台线程继续之前进行UI更新。

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

3
是的,在大多数情况下它通常是线程安全的。在WPF中(与WinForms不同),数据绑定类会寻找UI线程的 Dispatcher 并使用它(如果需要)自动传递到UI线程。但是请注意,这是同步完成的- 当UI被重绘时,您的后台线程将会阻塞,我曾见过它导致背景更新迅速而出现了卡顿, "冻结"和其他意想不到的效果。

在此处查看类似的问题: WPF数据绑定线程安全?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接