关于如何防止 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线程的调用,也就是系统不检查这些非法的操作,闭着眼睛让你过......程序崩溃了它不管

以上几种方式,大家看着适合的情况下用吧,反正我是不推荐使用无脑的方式的

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值