WPF启动后的两个线程:一个线程负责呈现,它隐藏在后台运行。另一个线程负责UI界面管理,主要接收收入、处理事件、绘制屏幕以及运行应用程序代码,即UI线程。
WPF中每个界面及界面中的控件都继承自DispatcherObject类,DispatcherObject包含一个公共属性Dispatcher。当前执行的主窗体及各个控件,在初始化时就都自动赋值了Dispatcher属性,并且都指向同一个UI线程所拥有的Dispatcher对象。
1.Dispatcher两个注册工作项的方法:
Invoke 和 BeginInvoke。这两个方法都是通过调度一个委托来执行。其中Invoke 是同步调用,也就是说,直到 UI 线程实际执行完该委托它才返回。而BeginInvoke是异步的,将立即返回。
2.Dispatcher的使用:
1).解决“从一个非 UI 线程中更新一个由UI线程创建的对象”。
在一个子线程中直接访问或更新UI线程创建的对象,会报异常。因为DispatcherObject对象只能被创建它的线程所访问,其他线程修改 DispatcherObject需要取得对应的Dispatcher,调用Invoke或者BeginInvoke来投入任务。所以此时我们可以利用Dispatcher的Invoke或BeginInvoke方法来完成对UI线程上控件的更新。
例如:另一个线程中更新Lable控件的内容
//新建线程
Thread thread = new Thread(UpdateLableText);
thread.Start();
private void UpdateLableText()
{
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
(ThreadStart) delegate()
{
WPF UI线程与Dispatcher的使用详解

本文详细介绍了WPF中UI线程的角色,包括一个负责呈现、另一个负责UI管理的线程。强调了Dispatcher的重要性,它用于在非UI线程中安全地更新UI。Dispatcher提供了Invoke和BeginInvoke两种方法,前者同步执行,后者异步。同时,文章通过实例说明了如何避免在Dispatcher中处理耗时操作,以防止UI卡死,并提倡在新线程中进行计算,然后通过Dispatcher更新UI。
最低0.47元/天 解锁文章
732

被折叠的 条评论
为什么被折叠?



