msdn的備注:
當運行 Windows 窗體時,它將創建新窗體,然后該窗體等待處理事件。 該窗體在每次處理事件時,均將處理與該事件關聯的所有代碼。 所有其他事件在隊列中等待。 當代碼處理事件時,應用程序不會響應。 例如,如果將甲窗口拖到乙窗口之上,則乙窗口不會重新繪制。
如果在代碼中調用 DoEvents,則您的應用程序可以處理其他事件。 例如,如果您有向 ListBox 添加數據的窗體,並將 DoEvents 添加到代碼中,那么當將另一窗口拖到您的窗體上時,該窗體將重新繪制。 如果從代碼中移除 DoEvents,那么在按鈕的單擊事件處理程序執行結束以前,您的窗體不會重新繪制。 有關消息的更多信息,請參見 Windows 窗體中的用戶輸入。
例子:
寫一個程序,做一個循環輸出文本的例子,不加Application.DoEvents()則值只顯示輸出循環結束時的結果,如果加了則可以實時的輸出。這個語句的確定是影響了程序的效率。
private void button1_Click(object sender, EventArgs e) { long t1 = System.DateTime.Now.Ticks; for (int i = 0; i < 10000; i++) { textBox1.Text = i.ToString(); System.Windows.Forms.Application.DoEvents(); } long t2 = System.DateTime.Now.Ticks; textBox2.Text = (t2 - t1).ToString(); }
含有System.Windows.Forms.Application.DoEvents(); textBox2.Text 為23471342
private void button2_Click(object sender, EventArgs e) { long t1 = System.DateTime.Now.Ticks; for (int i = 0; i < 10000; i++) { textBox3.Text = i.ToString(); //System.Windows.Forms.Application.DoEvents(); } long t2 = System.DateTime.Now.Ticks; textBox4.Text = (t2 - t1).ToString(); }
不含有System.Windows.Forms.Application.DoEvents(); textBox2.Text 為10900624
所以 DoEvents的好處是可以給用戶帶來好的用戶體驗,而壞處則是成倍的降低程序運行效率