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

Application.DoEvents()在Winform开发中用于处理长时间运行任务时避免界面假死,它允许UI线程处理其他消息。尽管代码简洁且无需线程同步,但可能导致事件调用混乱、资源耗尽甚至崩溃。建议避免使用,转向多线程以遵循更好的编程实践。
摘要由CSDN通过智能技术生成

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消息大乱次序、提前触发。比如说你在鼠标点击某个控

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值