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

Seb*_*ray 16 c# wpf thread-safety

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

调用线程无法访问此对象,因为另一个线程拥有它.

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

Nol*_*rin 41

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

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

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

this.Dispatcher.Invoke((Action)(() =>
    {
        ...
    }));
Run Code Online (Sandbox Code Playgroud)