Application.DoEvents
記得第一次使用Application.DoEvents()是為了在加載大量數(shù)據(jù)時(shí)能夠有一個(gè)數(shù)據(jù)加載的提示,不至于系統(tǒng)出現(xiàn)假死的現(xiàn)象,當(dāng)時(shí)也沒(méi)有深入的去研究他的原理是怎樣的,結(jié)果在很多地方都用上了Application.DoEvents(),今天看到了關(guān)于這方面的一些文章,知道我以前有些用法是不當(dāng)?shù)?#xff0c;有些地方需要慎用
?
Application.DoEvents()。
首先我們先看看在循環(huán)比較大的程序中,它的作用還是不錯(cuò)的,起到了一個(gè)實(shí)時(shí)響應(yīng)的效果,例如:
?
for?(int?q?=?0;?q?<?1000000;?q++)????????????{
????????????????textBox1.Text?=?q.ToString();
????????????????Application.DoEvents();//實(shí)時(shí)響應(yīng)文本框中的值
????????????}
如果沒(méi)有加上 DoEvents的話,由于循環(huán)時(shí)間會(huì)比較久就會(huì)出現(xiàn)假死的狀態(tài),而且程序不能處理其他的事件。而如果加上DoEvents的話就會(huì)對(duì)文本框的值實(shí)時(shí)響應(yīng),給用戶帶來(lái)較好的用戶體驗(yàn),可是DoEvents也帶來(lái)了效率上的問(wèn)題,處理同樣的一個(gè)事件調(diào)用了DoEvents后效率降低了好幾倍,這也是為什么要慎用的原因了。下面是我做的一個(gè)測(cè)試:
????????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();//計(jì)算耗時(shí)
????????}
????????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();//計(jì)算耗時(shí)
????????}
執(zhí)行耗時(shí)對(duì)比:
從較大數(shù)據(jù)的循環(huán)中可以看出效率是很低的,所以如果能不調(diào)用DoEvents就盡量不用。也可以通過(guò)別的方法來(lái)處理的,例如多線程異步調(diào)用等。
MSDN中的定義:
當(dāng)運(yùn)行 ? Windows ? 窗體時(shí),它將創(chuàng)建新窗體,然后該窗體等待處理事件。該窗體在每次處理事件時(shí),均將處理與該事件關(guān)聯(lián)的所有代碼。所有其他事件在隊(duì)列中等待。在代碼處理事件時(shí),應(yīng)用程序并不響應(yīng)。例如,當(dāng)將另一窗口拖到該窗口前面時(shí),該窗口不重新繪制。如果在代碼中調(diào)用 ? DoEvents,則您的應(yīng)用程序可以處理其他事件。例如,如果您有向 ? ListBox?? 添加數(shù)據(jù)的窗體,并將 ? DoEvents ? 添加到代碼中,那么當(dāng)將另一窗口拖到您的窗體上時(shí),該窗體將重新繪制。如果從代碼中移除 ? DoEvents,那么在按鈕的單擊事件處理程序執(zhí)行結(jié)束以前,您的窗體不會(huì)重新繪制。???
?通常,您在循環(huán)中使用該方法來(lái)處理消息。
轉(zhuǎn)載于:https://www.cnblogs.com/VOIP/archive/2010/12/08/1900497.html
總結(jié)
以上是生活随笔為你收集整理的Application.DoEvents的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 锋利的jQuery--jQuery与DO
- 下一篇: 天线设计该如何入门