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