如何以线程安全的方式访问c#WPF控件?

时间:2009-08-16 10:54:28

标签: c# wpf thread-safety

我尝试过使用MSDN中的示例,但它们似乎只适用于Windows窗体。例如,使用.InvokeRequired的方法依赖于窗体控件,但是此方法不适用于WPF控件。 Backgound工作方法也会抛出InvalidOperationException -

  

调用线程无法访问它   对象,因为不同的线程拥有   它

那么如何在WPF环境中完成呢?

1 个答案:

答案 0 :(得分:41)

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

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

示例用法可能如下(在Window / UserControl的代码隐藏中):

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