WPF怎么跨线程访问UI控件

Posted 不羁的爱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF怎么跨线程访问UI控件相关的知识,希望对你有一定的参考价值。

在WPF应用中,如果遇到多线程的需求时,如果引用WPF控件时会引发异常,异常内容:调用线程无法访问此对象,因为另一个线程拥有该对象。

WPF 对象是从 DispatcherObject 派生的,这提供了用于处理并发和线程的基本构造。 WPF 基于调度程序实现的消息系统。 其工作方式与常见的 Win32 消息泵非常类似;事实上,WPF 调度程序使用 User32 消息执行跨线程调用。当WPF用户线程中更新UI时,要通过Dispatcher来进行。

以下是常见的几种模式:

ViewModel中对UI绑定的数据进行访问,有的控件不支持MVVM直接在其他线程里操作此控件绑定的对象,会造成线程无法访问此对象,此方法是异步访问,不等待返回结果继续执行后面的代码

string code = string.Empty;
Application.Current.Dispatcher.BeginInvoke(new Action(() => 
  Line = 2;
  code = Document.Text;
));
evaluation.TaoCodeCompile(code);
evaluation.Execute();

如果想要同步访问改为Invoke即可

Application.Current.Dispatcher.Invoke(new Action(() => 
  Line = 2;
  code = Document.Text;
));         
evaluation.TaoCodeCompile(code);
evaluation.Execute();

在View.xmal.cs里如果需要跨线程访问时可以使用

string code = string.Empty;
Dispatcher.Invoke(() => 

    code = PART_TextEditor.Document.Text;
);

如果想要异步访问改为BeginInvoke即可

string code = string.Empty;
Dispatcher.BeginInvoke(() => 

    code = PART_TextEditor.Document.Text;
);

 

以上是关于WPF怎么跨线程访问UI控件的主要内容,如果未能解决你的问题,请参考以下文章

WPF中窗口控件的跨线程调用

wpf中 我新开一个线程添加控件到主窗体

c#如何跨线程调用窗体控件

多线程更新UI的常用方法

跨线程操作Treeview

C#WinForm在新线程中动态创建控件时,gif图动不动