今天,在按照書上的一個winform例子做練習(實則就是邊看邊抄了一遍...)的時候,看到application.DoEvents()這個方法,但是并不明白這個方法是做什么用的。只知道不用這個方法的話,在循環做耗時操作的時候,窗口ui繪制會出現問題。
于是在網上查找了一下,但是頭昏腦漲的,那些理論和概念對我來講,有點難懂。但是眼前我只是想理解這個方法的作用,于是便按照自己的理解去淺顯的給它作出解釋。
PRivate void btnCopy_Click(object sender, EventArgs e) { List<FileInfo> fileList = GetFileList(); foreach (FileInfo file in fileList) { try { labStatus.Text = "Copying " + txtTargetDir.Text + "//" + file.Name + "..."; Application.DoEvents(); //復制文件到目標位置 file.CopyTo(txtTargetDir.Text + "//" + file.Name, chbOverWrite.Checked); } catch (Exception ex) { MessageBox.Show(ex.Message); } } labStatus.Text = "Done."; }
上面的代碼是我做練習時候的其中一段,目的是點擊copy按鈕的時候,在名為labStatus的label上顯示一段文字,然后后臺就copy一個文件,如此循環,直到要copy的文件全部copy完成,最后將labStatus上的文字變成Done。
如此運行的話,是沒有什么問題的。但是我不太理解Application.DoEvents()方法在這里起了何種作用,于是將Application.DoEvents()注釋掉再運行。當我點擊copy之后,窗口像是“死掉”了一樣,但是后臺的文件確實是正在復制,復制完成之后,labStatus的text變成done。
在我查找資料的過程中,我才知道windows的消息機制。但是那些深入的理論,對于我目前來說有點看著頭疼,看了也看不懂,又不會去用,看了也會忘記的。于是我淺顯的了解了一點目前需要的。
以下看起來比較書面的文字,是我抄錄來的。
1,消息,就是指Windows發出的一個通知,告訴應用程序某個事情發生了。例如,單擊鼠標、改變窗口尺寸、按下鍵盤上的一個鍵都會使Windows發送一個消息給應用程序。
2,Windows的消息系統是由3個部分組成的:
·窗口過程。每個窗口都有一個窗口過程來接收傳遞給窗口的消息,它的任務就是獲取消息然后響應它。窗口過程是一個回調函數;處理了一個消息后,它通常要返回一個值給Windows。
3,一個消息從產生到被一個窗口響應,其中有5個步驟:
1) 系統中發生了某個事件。
2) Windows把這個事件翻譯為消息,然后把它放到消息隊列中。
3)應用程序從消息隊列中接收到這個消息,把它存放在TMsg記錄中。
4)應用程序把消息傳遞給一個適當的窗口的窗口過程。
5) 窗口過程響應這個消息并進行處理。
步驟3和4構成了應用程序的消息循環。消息循環往往是Windows應用程序的核心,因為消息循環使一個應用程序能夠響應外部的事件。消息循環的任務就是從消息隊列中檢索消息,然后把消息傳遞給適當的窗口。如果消息隊列中沒有消息,Windows就允許其他應用程序處理它們的消息。
到這里也就差不多了,其他的資料看了也沒看,大概能看懂的也記不住,就不提了。那么回到原本的話題上來,Application.DoEvents()方法在這里起了什么作用?
我的比較淺顯的理解是,在上面那段代碼里,當我們點擊copy按鈕之后,在循環中,每一次windows都往當前消息隊列里添加了兩個消息,一個是labStatus的text要改變,另一個是要copy一個文件,然而copy一個文件很明顯是比較耗時的操作。在我注釋掉Application.DoEvents()這行代碼之后,從運行的窗口展現出來的效果來看,很顯然,它是先將copy文件的那個消息響應了,然后在所有的copy文件操作都執行完了之后,再去響應了labStatus的text改變操作,但是一次性執行循環里的所有labStatus的text改變操作的話,我們就只能看得見最后的 labStatus.Text = "Done.";所產生的效果了。當然,在copy過程中,我們要去點擊窗口,或者拖動窗口,這些操作是要等到copy之后的。
所以,Application.DoEvents()方法所做的事情,正如它的介紹一樣——處理當前在消息隊列里的所有windows消息。
但是我還是有很多很多不明白的地方,比如為什么是先響應了copy操作呢?這個隊列是怎么排列的呀?不過現在暫且就這樣了。以上就是我的個人的理解,它或許根本就是錯誤的,或許有許多很幼稚的地方,請看到的朋友們告訴我,幫助我的學習,也順便鞏固下您自己。謝謝!
新聞熱點
疑難解答