1. 程式人生 > >c#學習筆記之Application.DoEvents應用

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

box nbsp net replace 運算 技術 oop blank 假死

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

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