代码之家  ›  专栏  ›  技术社区  ›  Perplexed

从计时器向WPF UI触发事件

  •  2
  • Perplexed  · 技术社区  · 14 年前

    我有一个应用程序,它由一个WPF UI组成,在它下面有一个“基础结构”层,它对各种带有数据的服务有一些引用。我有一个类,updater,它有几个属性,表示要被UI层使用的数据。这个更新程序有一个Systems.Timer函数,它每隔一分钟左右就对服务进行同步调用,并用数据的“刷新”来更新上述属性。

    我想从这个类引发一个事件,当它完成时,可以通知UI更改。当我以前做过类似这样的事情时,它会左右抛出异常,因为触发事件的线程是不同的(因为它来自计时器经过的事件),然后创建对象的线程。

    我现在使用的糟糕的解决方案是在UI层上有另一个计时器,但是…糟糕。

    通知用户界面更新程序类已经完成了它的工作,最好的方法是什么?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Charlie    14 年前

    这些跨线程异常可以通过 Dispatcher.Invoke 功能。这个 Dispatcher 是可用于调用UI线程的对象。给予 this article 一个彻底的阅读,你应该都准备好了。

        2
  •  -1
  •   Jake    14 年前

    最好的方法是通过绑定,如果你能做到的话。实施 System.ComponentModel.INotifyPropertyChanged 与数据类接口,然后将UI元素绑定到要显示的这些类的属性。当更新属性时,它们将激发 PropertyChanged 事件,由WPF依赖对象内部处理,并自动更新您的UI。这是一种避免很多管道系统的方法,通常情况下,您必须将它们组合在一起以响应更新。

    This 博客条目提供了一个如何使用它的很好的例子,但是在线上还有很多可用的。