c#學習筆記之Application.DoEvents應用


Visual Studio里的摘要:處理當前在消息隊列中的所有 Windows 消息。

交出CPU控制權,讓系統可以處理隊列中的所有Windows消息 
比如在大運算量循環內,加Application.DoEvents可以防止界面停止響應


因為winform的消息循環是一個線程來處理,那么假如你的某個操作比較耗時,那么消息處理得等你這個耗時操作做完了才能繼續,而Application.DoEvents方法就是允許你在耗時操作的內部調用它,而去處理消息隊列中的消息。 

像鼠標移動鼠標點擊都是windows消息,如果耗時操作一直進行,那么界面就像死鎖一樣。

 

 

記得第一次使用Application.DoEvents()是為了在加載大量數據時能夠有一個數據加載的提示,不至於系統出現假死的現象,當時也沒有深入的去研究他的原理是怎樣的,結果在很多地方都用上了Application.DoEvents(),今天看到了關於這方面的一些文章,知道我以前有些用法是不當的,有些地方需要慎用

 

 

Application.DoEvents()。
首先我們先看看在循環比較大的程序中,它的作用還是不錯的,起到了一個實時響應的效果,例如:

 

 

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就盡量不用。也可以通過別的方法來處理的,例如多線程異步調用等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM