关于如何防止 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界面卡死的问题,并带开关

WinForm 多线程+委托来防止界面假死

解决界面卡死的问题

tkinter界面卡死的解决办法

Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析

tkinter界面卡死的解决办法