c#中Application.DoEvents()的做用

做用:交出CPU控制权,让系统能够处理队列中的全部Windows消息,好比在大运算量循环内,加Application.DoEvents能够防止界面中止响应,由于winform的消息循环是经过新建立一个线程来处理的,那么假如你的某个操做比较耗时,那么消息处理得等你这个耗时操做作完了才能继续,而Application.DoEvents方法就是容许你在耗时操做的内部调用它,而去处理消息队列中的消息。像鼠标移动鼠标点击都是windows消息,若是耗时操做一直进行,那么界面就像死锁同样。windows

例如:当我点击按钮button3时,线程就进入了无尽的for循环中,直到循环结束。在这循环的期间,你不能对窗口进行任何的操做(窗口进入一种假死的状态,不能移动窗口等其余操做),并且button3的text最终只显示99999999,并不会依次显示1,2,3.....99999ide

        private void button3_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 10000000; i++) {
                button3.Text = i.ToString();
            }
        }

又例如,加上Application.DoEvents以后,最明显的变化就是button3的text会依次显示1,2,3.....99999,简单的理解就是:每一次Application.DoEvents()循环以后,就交出CPU的控制权,而后button3.Text的值就有时间能够变成i.ToString(),而后再循环,再变,直到循环结束。性能

        private void button3_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 10000000; i++) {
                button3.Text = i.ToString();
                Application.DoEvents();
            }
        }

可是好处有了,缺点也是有的线程

一、速度慢:orm

不用Application.DoEvents的速度为2秒多blog

 

 用了以后的速度为58秒多,相差30倍.....队列

 

 二、存在"bug"。循环的过程当中,点击窗口或者作其余操做,会致使循环暂停(其实也很好理解,这个东西实际也是在同一个线程上操做的,你点击窗口把线程占用了,那么循环就只能暂停咯~),直到不占用线程,循环继续。消息队列

最后仍是感受这个东西看状况使用吧。不是说用的多就好,会影响性能。it