一.首先为什么要有dispather?
wpf程序是有一个主线程多个子线程组成的。主线程负责创建ui界面,数据接收,处理事件,子线程负责处理消耗资源较多耗时的操作。然而子线程不能直接访问主线程那么这个时候就需要调度者dispather。
System.Windows.Threading.DispatcherObject 类:大部分控件与其他类大多是继承 DispatcherObject 类,它提供了用于处理并发和线程的基本构造
二.wpf启动的时候会加载2个线程:一个用于呈现用户界面,另一个用于管理用户界面。而我们通常面对的时ui线程。使用一个 WPF 对象,只能在创建它的线程上使用。在其他线程上使用它会导致引发运行时异常。 UI 线程的作用是用于接收输入、处理事件、绘制屏幕以及运行应用程序代码。
同事dispatherobject提供了invoke(同步操作)和BeginInvoke(异步操作)来更新ui对象创建的信息。
在后台(*.xaml.cs)的错误访问例子:
通过下面方式修改
意思是:获取当前对象的调度,通过invoke方法来实现对其他线程ui界面内容的更改。
总结:
DispatcherObject对象只能被创建它的线程所访问,其他线程修改 DispatcherObject需要取得对应的Dispatcher,调用Invoke或者BeginInvoke来投入任务