关于Application.DoEvents()==转

 

记得第一次使用Application.DoEvents()是为了在加载大量数据时可以有一个数据加载的提示,不至于系统出现假死的现象,当时也没有深刻的去研究他的原理是怎样的,结果在不少地方都用上了Application.DoEvents(),今天看到了关于这方面的一些文章,知道我之前有些用法是不当的,有些地方须要慎用Application.DoEvents()。
首先咱们先看看在循环比较大的程序中,它的做用仍是不错的,起到了一个实时响应的效果,例如:
windows

for (int q = 0; q < 1000000; q++)
            {
                textBox1.Text = q.ToString();
                Application.DoEvents();//实时响应文本框中的值
            }
若是没有加上 DoEvents的话,因为循环时间会比较久就会出现假死的状态,并且程序不能处理其余的事件。而若是加上DoEvents的话就会对文本框的值实时响应,给用户带来较好的用户体验,但是DoEvents也带来了效率上的问题,处理一样的一个事件调用了DoEvents后效率下降了好几倍,这也是为何要慎用的缘由了。下面是我作的一个测试:
        private void button1_Click(object sender, EventArgs e)
        {
            expendTime.start();
            for (int q = 0; q < 100000; q++)
            {
                textBox1.Text = q.ToString();
                Application.DoEvents();
            }
            label2.Text = expendTime.ComputerTime();//计算耗时
        }

        private void button2_Click(object sender, EventArgs e)
        {
            expendTime.start();
            for (int q = 0; q < 100000; q++)
            {
                textBox2.Text = q.ToString();
            }
            label3.Text = expendTime.ComputerTime();//计算耗时
        }

执行耗时对比:
从较大数据的循环中能够看出效率是很低的,因此若是能不调用DoEvents就尽可能不用。也能够经过别的方法来处理的,例如多线程异步调用等。
MSDN中的定义:
当运行   Windows   窗体时,它将建立新窗体,而后该窗体等待处理事件。该窗体在每次处理事件时,均将处理与该事件关联的全部代码。全部其余事件在队列中等待。在代码处理事件时,应用程序并不响应。例如,当将另外一窗口拖到该窗口前面时,该窗口不从新绘制。若是在代码中调用   DoEvents,则您的应用程序能够处理其余事件。例如,若是您有向   ListBox   添加数据的窗体,并将   DoEvents   添加到代码中,那么当将另外一窗口拖到您的窗体上时,该窗体将从新绘制。若是从代码中移除   DoEvents,那么在按钮的单击事件处理程序执行结束之前,您的窗体不会从新绘制。   
 一般,您在循环中使用该方法来处理消息。
具体可参考这里
相关文章
相关标签/搜索