14
我试过使用MSDN中的例子,但它们似乎只适用于Windows窗体。例如,使用.InvokeRequired的方法依赖于Windows窗体控件,但是此方法不适用于WPF控件。该Backgound工人方法抛出InvalidOperationException
以及 -如何以线程安全的方式访问c#WPF控件?
,因为不同的线程拥有 它调用线程不能访问此 对象。
那么这怎么可以在WPF的上下文中完成呢?
我试过使用MSDN中的例子,但它们似乎只适用于Windows窗体。例如,使用.InvokeRequired的方法依赖于Windows窗体控件,但是此方法不适用于WPF控件。该Backgound工人方法抛出InvalidOperationException
以及 -如何以线程安全的方式访问c#WPF控件?
,因为不同的线程拥有 它调用线程不能访问此 对象。
那么这怎么可以在WPF的上下文中完成呢?
您只是想使用Dispatcher.Invoke
方法(或异步等效的Dispatcher.BeginInvoke
),该方法会将调用封送到主WPF UI线程。
DependencyObject
类包含一个Dispatcher
属性,这意味着从该类继承的所有控件和其他对象也以类似于WinForms的方式提供此属性。另外,Application
对象提供对调度程序的访问。
一个例子的使用可能是以下的(a Window
/UserControl
的代码隐藏):
this.Dispatcher.Invoke((Action)(() =>
{
...
}));
谢谢,这完美地工作。当你知道你需要做什么时,它实际上在WPF中看起来比赢取表单简单得多;-) – 2009-08-16 20:54:33
没问题。是的,WPF肯定有更好的线程/消息泵模型。 – Noldorin 2009-08-16 21:07:45