关于如何防止 WinForm 界面卡死的老生常谈
Posted lee576
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于如何防止 WinForm 界面卡死的老生常谈相关的知识,希望对你有一定的参考价值。
前几天面试了一个人,谈到项目经验时说到最近做的都是 WinForm 的项目,我便随口一问,当遇到界面卡死时,如何解决这个问题,于是对方开始大谈,卡死原因有很多,什么数据库访问数据量大等等,说的都是外在表现,但是内在的问题怎么解决却是答不上来,看看简历也写着8年的工作经验,我也不知道该说什么了。下面我总结几个方式吧!
1.Application.DoEvents()
这个方式其实还是单线程,只不过系统划分了一些时间片给UI线程,让UI得到及时的更新,但运行效率却很低下,优点是比较无脑的傻瓜式操作!方便易用,但是也容易有副作用,计算量大的情况下导致方法执行时间过长!
2.SynchronizationContext UI线程同步上下文
这种方式比较传统,Post 和 Send 语义不是很优雅,使用起来感觉就是别扭,代码可读性差
3.TaskScheduler.FromCurrentSynchronizationContext
其实还是使用的 UI线程同步上下文,只不过加入了线程池和调度器
4. 方法3 + async + Unwrap
算是方法3的改进版,这里有个讨论和比较
5. UI 控件的 Invoke/BeginInvoke
也是异步委托的方式,反正也是别扭,代码可读性差
6. 使用BackgroundWorker 取代 Thread 执行异步操作
是个不错的选择,可以挂载不同的事件处理,比如进度报告,完成以后挂载触发事件
7. 设置窗体的属性 CheckForIllegalCrossThreadCalls,这种方式是最无脑的,也是最不负责的,不检查任何跨线程的对UI线程的调用,也就是系统不检查这些非法的操作,闭着眼睛让你过......程序崩溃了它不管
以上几种方式,大家看着适合的情况下用吧,反正我是不推荐使用无脑的方式的
以上是关于关于如何防止 WinForm 界面卡死的老生常谈的主要内容,如果未能解决你的问题,请参考以下文章
多线程委托Invoke解决winform界面卡死的问题,并带开关