【问题标题】:Updating bound properties from a background thread从后台线程更新绑定属性
【发布时间】:2012-01-24 21:49:17
【问题描述】:

我有一个 WPF 控件,它绑定到我的 ViewModel 中的属性。令我惊讶的是(因为这似乎不是 WPF 的一个广为宣传的功能),从后台线程更改绑定属性似乎没有问题。我的 UI 更新无一例外。为什么是这样?从后台线程更新绑定属性是否存在任何性能问题或任何其他限制?

【问题讨论】:

  • 这就是为什么在可能的情况下最好使用绑定而不是使用调度程序的原因之一。
  • 可能是在主UI线程上调用Invoke来改变UI

标签: c# wpf multithreading data-binding


【解决方案1】:

WPF 自动确保绑定在主线程上更新。

没有性能影响。如果有的话,最好在后台线程上进行属性更新。向主线程发送更新会增加在那里完成的工作量。您将同时更新 View 和 ViewModel,而不仅仅是 View。差异通常可以忽略不计,但如果大量更新发生得很快,则可能会导致 UI 的响应速度更快下降。

【讨论】:

    【解决方案2】:

    这是因为WPF 负责将绑定的数据编组到 UI 线程。 据我所知,这只适用于标量数据。对于集合,您必须注意在非 UI 和 UI 线程之间正确管理它。

    没有显着的开销,因为最终它应该做与多线程相同的事情(可能以稍微更优化的方式)。

    【讨论】:

      【解决方案3】:

      视情况而定。

      它只会“自动”执行此操作 (IIRC),以针对实现 INotifyPropertyChanged 的​​属性进行绑定。 DependencyProperties 和 DependencyObjects 具有线程关联性,如果您尝试从另一个线程更新它们,则会抛出异常。

      Binding 类有一个名为IsAsync 的属性,它在某些特殊情况下从另一个线程更新属性时会有所帮助,这样更新就不会阻塞 UI。在你真正需要它之前,你并不真正需要它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-02
        • 2012-04-24
        相关资源
        最近更新 更多