【Winform】关于Application.DoEvents()的理解

Winform开发时,偶尔会在一个耗时的处理中用到Application.DoEvents()这个方法,可以让UI线程在当前代码上下文中切换去处理其它Windows消息,从而避免界面的假死。

例如,经常会这么用:

        public static void Delay(int nMilliSeconds)
        {
            DateTime dt = DateTime.Now;
            dt = dt.AddMilliseconds(nMilliSeconds);
            while (dt > DateTime.Now)
            {
                Application.DoEvents();//转让控制权
            }
            return;
        }

在UI线程中调用这个方法,就可以阻塞当前执行的上下文一段时间,阻止代码继续执行,但同时又不会导致界面假死。效果类似于Thread.Sleep(),但Sleep()是让UI线程直接阻塞,从而停止响应。

这种功能当然用多线程是可以做到的。但这种方式相比多线程的优势就在于代码简洁和无需做线程同步。

从应用的角度来讲,这个方法是一大利器,可以在单线程里实现类似多线程的效果。但是既然如此,为什么微软的官方文档里都没有看到这个推荐使用这个方法呢?猜想这个方法应该有较大的副作用。

随后在CSDN一篇帖子上看到一位大佬讲述了这个方法的历史,以下摘自原帖:

DoEvents 是 vb(4、5、6)的产物,因为那是单线程的。
它的机制是将你的应用中尚未触发的windows消息大乱次序、提前触发。比如说你在鼠标点击某个控

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值