關於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,那麼在按鈕的單擊事件處理程序執行結束之前,您的窗體不會從新繪製。   
 一般,您在循環中使用該方法來處理消息。
具體可參考這裏
相關文章
相關標籤/搜索