从Timer到WPF UI触发事件

时间:2010-06-04 21:54:29

标签: c# wpf

我有一个应用程序,它包含一个WPF UI,其下面有一个“基础结构”层,其中包含对带有数据的各种服务的一些引用。我有一个类Updater,它有一些属性,表示UI层要使用的数据。这个更新程序有一个Systems.Timer函数,每分钟左右,它会对服务进行同步调用,并通过“刷新”数据来更新上述属性。

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

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

通知UI的最佳方式是Updater类是否完成了它的工作?

2 个答案:

答案 0 :(得分:3)

可以通过Dispatcher.Invoke函数更新UI来解决这些跨线程异常。 Dispatcher是一个可用于调用UI线程的对象。给this article一个彻底的阅读,你应该全部准备好。

答案 1 :(得分:-1)

最好的方法是通过绑定,如果你能够。使用数据类实现System.ComponentModel.INotifyPropertyChanged接口,然后将UI元素绑定到要显示的这些类的属性。更新属性后,它们会触发PropertyChanged事件,该事件由WPF依赖项对象在内部处理,并自动更新UI。这是一种避免大量管道工作的方法,您通常必须将它们放在一起以响应更新。

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