WPF双向原理

本文探讨了在WPF和WinForm应用中,如何处理子线程与主线程之间的交互,特别是在UI更新方面。WPF利用Dispatcher.BeginInvoke异步更新UI,而WinForm则使用Control.Invoke。当长时间操作可能导致性能问题时,文章提到了非泵式等待错误的产生原因及解决方案,包括优化业务操作和检查异常处理,并简单提及了线程取消的操作。
摘要由CSDN通过智能技术生成

在WPF或WinForm应用程序中,主线程负责接收输入、处理事件、绘制屏幕等工作,为了使主线程及时响应,防止假死,在开发过程中对一些耗时的操作、消耗资源比较多的操作,都会去创建一个或多个子线程去完成操作,比如大数据量的循环操作、后台下载。这样一来,由于UI界面是主线程创建的,所以子线程不能直接更新由主线程维护的UI界面
在WPF的例子中,是通过this.Dispatcher.BeginInvoke或者Application.Current.Dispatcher.BeginInvoke去异步更新UI的。业务处理是通过异步Task方法去处理的,而task并非UI线程,所以不能直接在task里面直接更新UI.Dispatcher就是UI线程
在这里插入图片描述
System.Windows.Threading.DispatcherObject 类:从图中看WPF 中的使用到的大部分控件与其他类大多是继承 DispatcherObject 类,它提供了用于处理并发和线程的基本构造
所有的UI都是继承自DependencyObject和DispatcherObject,我们通常为UI设置依赖属性,我们在后台改变依赖属性的值,也就是访问依赖对象DependencyObject,即UI,这个时候往往要用Dispatcher获取当前UI的线程(即获取对DispatcherObject和DependencyObject的访问的权力)

WinForm的例子中是使用Control.Invoke去使用UI线程。也可以设置Control.CheckForIllegalCrossThreadCalls = false;以非线程安全的方式直接访问UI的控件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值