做用:交出CPU控制權,讓系統能夠處理隊列中的全部Windows消息,好比在大運算量循環內,加Application.DoEvents能夠防止界面中止響應,由於winform的消息循環是經過新建立一個線程來處理的,那麼假如你的某個操做比較耗時,那麼消息處理得等你這個耗時操做作完了才能繼續,而Application.DoEvents方法就是容許你在耗時操做的內部調用它,而去處理消息隊列中的消息。像鼠標移動鼠標點擊都是windows消息,若是耗時操做一直進行,那麼界面就像死鎖同樣。windows
例如:當我點擊按鈕button3時,線程就進入了無盡的for循環中,直到循環結束。在這循環的期間,你不能對窗口進行任何的操做(窗口進入一種假死的狀態,不能移動窗口等其餘操做),並且button3的text最終只顯示99999999,並不會依次顯示1,2,3.....99999ide
private void button3_Click(object sender, EventArgs e) { for (int i = 0; i < 10000000; i++) { button3.Text = i.ToString(); } }
又例如,加上Application.DoEvents以後,最明顯的變化就是button3的text會依次顯示1,2,3.....99999,簡單的理解就是:每一次Application.DoEvents()循環以後,就交出CPU的控制權,而後button3.Text的值就有時間能夠變成i.ToString(),而後再循環,再變,直到循環結束。性能
private void button3_Click(object sender, EventArgs e) { for (int i = 0; i < 10000000; i++) { button3.Text = i.ToString(); Application.DoEvents(); } }
可是好處有了,缺點也是有的線程
一、速度慢:orm
不用Application.DoEvents的速度爲2秒多blog
用了以後的速度爲58秒多,相差30倍.....隊列
二、存在"bug"。循環的過程當中,點擊窗口或者作其餘操做,會致使循環暫停(其實也很好理解,這個東西實際也是在同一個線程上操做的,你點擊窗口把線程佔用了,那麼循環就只能暫停咯~),直到不佔用線程,循環繼續。消息隊列
最後仍是感受這個東西看狀況使用吧。不是說用的多就好,會影響性能。it