【问题标题】:WPF DataBinding Thread SafetyWPF 数据绑定线程安全
【发布时间】:2011-09-08 10:38:04
【问题描述】:

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

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

谢谢!!

【问题讨论】:

    标签: wpf multithreading data-binding synchronization


    【解决方案1】:

    是的,在大多数情况下。绑定对于单个对象是线程安全的(因此对于您的字符串应该没问题)。但是,绑定到集合不是线程安全的 - 仍然需要手动封送处理。如果您将控件绑定到集合,则无法在后台线程上更改集合。

    我了解,如果属性所在的类实现 INotifyPropertyChanged,则绑定框架会自动将 UI 更新编组到 UI 线程。但是,这是否仍然导致数据不同步?

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

    【讨论】:

    • 谢谢,你和克里斯都得到了答案。我没有意识到编组是同步发生的。
    【解决方案2】:

    是的,它通常是线程安全的。在 WPF(与 WinForms 不同)中,数据绑定类查找 UI 线程的 Dispatcher 并使用它(如果需要)自动编组到 UI 线程。但是请注意,这是同步完成的——您的后台线程将在重新绘制 UI 时阻塞,我已经看到这会导致不稳定、“冻结”和其他快速后台更新的意外效果。

    在此处查看类似问题:WPF Databinding thread safety?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多