c#是一門支援多執行緒的語言,因此執行緒的使用也是比較常見的。由於執行緒的知識在win32程式設計的時候已經說得過多,所以在.net中很少介紹這部分(可能.net不覺得這部分是它所特有的)。
那麼執行緒相關的問題大致有如下四類(這篇文章只討論單執行緒、單執行緒與
ui執行緒這兩方面的問題)。
問題一,執行緒的基本操作,例如:暫停、繼續、停止等;
問題二,如何向執行緒傳遞引數或者從中得到其返回值;
問題三,如何使執行緒所占用的
cpu不要老是百分之百;
最後乙個,也是問題最多的,就是如何在子執行緒來控制
ui
對於問題一,我不建議使用
thread
類提供的
suspend
、resume
以及abort
這三個方法,前兩個有問題,好像在
vs05
已經遮蔽這兩個方法;對於
abort
來說,除了資源沒有得到及時釋放外,有時候會出現異常。如何做呢,通過設定開關變數來完成。
對於問題二,我不建議使用靜態成員來完成,僅僅為了執行緒而破壞類的封裝有些得不償失。那如何做呢,通過建立單獨的執行緒類來完成。
對於問題三來說,造成這個原因是由於執行緒中進行不間斷的迴圈操作,從而使cpu完全被子執行緒占有。那麼處理此類問題,其實很簡單,在適當的位置呼叫thread.sleep(20)來釋放所占有cpu資源,不要小看這20毫秒的睡眠,它的作用可是巨大的,可以使其他執行緒得到cpu資源,從而使你的cpu使用效率降下來。
在子執行緒中操縱ui執行緒中的物件
首先說說,為什麼不能直接在子執行緒中操縱ui呢。原因在於子執行緒和
ui執行緒屬於不同的上下文,換句比較通俗的話說,就好比兩個人在不同的房間裡一樣,那麼要你直接操作另乙個房間裡的東西,恐怕不行罷,那麼對於子執行緒來說也一樣,不能直接操作
ui執行緒中的物件。
那麼如何在子執行緒中操縱ui執行緒中的物件呢,.net提供了invoke和begininvoke這兩種方法。簡單地說,就是子執行緒發訊息讓ui執行緒來完成相應的操作。
這兩個方法有什麼區別,這在我以前的文章已經說過了,invoke
需要等到所調函式的返回,而
begininvoke
則不需要。
用這兩個方法需要注意的,有如下三點:
第乙個是由於
invoke
和begininvoke
屬於control
型別的成員方法,因此呼叫的時候,需要得到
control
型別的物件才能觸發,也就是說你要觸發窗體做什麼操作或者窗體上某個控制項做什麼操作,需要把窗體物件或者控制項物件傳遞到執行緒中。
第二個,對於
invoke
和begininvoke
接受的引數屬於乙個
delegate
型別,我在以前的文章中使用的是
methodinvoker
,這是.net
自帶的乙個
delegate
型別,而並不意味著在使用
invoke
或者begininvoke
的時候只能用它。參看我給的第二篇文章(《如何彈出乙個模式視窗來顯示進度條》),會有很多不同的
delegate
定義。
最後乙個,使用
invoke
和begininvoke
有個需要注意的,就是當子執行緒在
form_load
開啟的時候,會遇到異常,這是因為觸發
invoke
的物件還沒有完全初始化完畢。處理此類問題,在開啟執行緒之前顯式的呼叫「
this.show();
splash
窗體的效果可能更好。這方面可以參看如下的例子。
為什麼使用多執行緒
1 耗時的操作使用執行緒,提高應用程式響應 2 並行操作時使用執行緒,如c s架構的伺服器端併發執行緒響應使用者的請求。3 多cpu系統中,使用執行緒提高cpu利用率 4 改善程式結構。乙個既長又複雜的程序可以考慮分為多個執行緒,成為幾個獨立或半獨 立的執行部分,這樣的程式會利於理解和修改。使用多執...
為什麼要使用多執行緒
一 多執行緒的一些解釋 來至知乎 我覺得解釋的比較好,比較詳細,就給大家分享一下 1 單程序單執行緒 乙個人在一張桌子上吃菜 2 單程序多執行緒 多個人在同一張桌子上吃菜 3 多程序單執行緒 多個人每個人在自己的桌子上吃菜 多執行緒的問題就是多個人在同一張桌子上吃同一道菜時會發生爭搶,如果兩個人同時...
為什麼要用多執行緒
以前我認為多執行緒的作用就是提公升效能。實際上,多執行緒並不一定能提公升效能 甚至還會降低效能 多執行緒也不只是為了提公升效能。多執行緒主要有以下的應用場景 1 避免阻塞 非同步呼叫 單個執行緒中的程式,是順序執行的。如果前面的操作發生了阻塞,那麼就會影響到後面的操作。這時候可以採用多執行緒,我感覺...