2009-08-16 83 views
14

我试过使用MSDN中的例子,但它们似乎只适用于Windows窗体。例如,使用.InvokeRequired的方法依赖于Windows窗体控件,但是此方法不适用于WPF控件。该Backgound工人方法抛出InvalidOperationException以及 -如何以线程安全的方式访问c#WPF控件?

,因为不同的线程拥有 它调用线程不能访问此 对象。

那么这怎么可以在WPF的上下文中完成呢?

回答

33

您只是想使用Dispatcher.Invoke方法(或异步等效的Dispatcher.BeginInvoke),该方法会将调用封送到主WPF UI线程。

DependencyObject类包含一个Dispatcher属性,这意味着从该类继承的所有控件和其他对象也以类似于WinForms的方式提供此属性。另外,Application对象提供对调度程序的访问。

一个例子的使用可能是以下的(a Window/UserControl的代码隐藏):

this.Dispatcher.Invoke((Action)(() => 
    { 
     ... 
    })); 
+0

谢谢,这完美地工作。当你知道你需要做什么时,它实际上在WPF中看起来比赢取表单简单得多;-) – 2009-08-16 20:54:33

+0

没问题。是的,WPF肯定有更好的线程/消息泵模型。 – Noldorin 2009-08-16 21:07:45