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