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;
});

 

上一篇:汇编复习部分笔记


下一篇:git中常见的几个命令