簡述進程、線程與項目的關系
首先在Visual Studio2010新建了一個WinForm項目WinFormApp1,里面會默認有個叫Form1的窗口。假設,項目WinFormApp1的功能是為了查詢遠端Ftp服務器的文檔目錄,然后把查到的結果顯示到Form1的界面上。通常的做法是在Form1.cs類中添加一個QueryFtpFiles()方法用于對遠端的ftp服務器進行讀操作,然后把讀到的內容顯示到界面上就算完成了。
在這個項目完成后,一般會先在本地或局域網內的某個Ftp服務器上先做個測試,這時你會發(fā)現(xiàn)程序很***地運行著。當你興致沖沖地把代碼交給你領導的時候,你的上司拿了遠在美國的ftp服務器來試運行,點擊“查詢”按鈕執(zhí)行QueryFtpFiles()查詢操作的時候,悲劇發(fā)生了——頁面死掉了(沒有響應)。。。你是不是覺得很沒面子?有木有?
這里有個問題,就是在執(zhí)行QueryFtpFiles()方法時,由于是對遠端的ftp服務器進行讀操作,本身IO操作就比較耗時,再考慮到網絡延遲等因素,你的界面就不得不停下了等待讀操作的完成。如果在這個讀操作完成前,你急不可耐地點了下界面,就出現(xiàn)了“沒有響應”的后果。
其實,我在運行這個項目的時候,實際上是在運行由這個項目自動在Debug或Release目錄下生成的WinFormApp1.exe應用程序,而WinFormApp1.exe對于我的Windows Server2003即操作系統(tǒng)來說,他就是一個進程。
操作系統(tǒng)書中講,傳統(tǒng)的進程有兩個基本屬性:擁有資源的獨立單位和可獨立調度和分配的基本單位。由于在進程的創(chuàng)建、撤銷和切換中,系統(tǒng)必須耗費較大的時空開銷。引入線程后,傳統(tǒng)的進程的兩個基本屬性分開,線程作為調度和分配的基本單位,進程作為獨立分配資源的單位。也就是說,在完成一個復雜的功能時,可以在一個進程中建立多個線程,每個線程分別完成某一項簡單功能,進程通過調度和排列組合這些線程來實現(xiàn)這個復雜的功能。
線程,其實就是一段代碼,一個方法或一連串方法,這段代碼或方法可以去完成某個功能,也可以什么都不用做,比如上面提到的QueryFtpFiles(),它其實就滿足作為線程的基本條件。
再回到原來的“沒有響應”的問題上,在執(zhí)行WinFormApp1.exe這個進程的時候,這個進程會調用UI線程,其實也就是Form1.cs內的代碼以及它調用的其他類的代碼,因為QueryFtpFiles()也在Form1.cs這個類中,所以它也算是UI線程的一部分。WinFormApp1.exe進程執(zhí)行時會首先調用這個UI線程(若沒有定義其他線程,這時UI線程應該也是這個進程的唯一線程),這個UI線程在執(zhí)行QueryFtpFile()方法的過程中由于耗時很多以至于這個進程其他什么什么操作都要停下來等待,包括你去點擊界面的操作。
問題的描述應該就是這樣了,至于解決方法,可以在UI線程中再定義另外一個線程thread1用來執(zhí)行QueryFtpFile()方法就可以了。
原文鏈接:http://www.cnblogs.com/computer-lzy/archive/2011/07/19/2111002.html
【編輯推薦】