C#是一門支持多線程的語言,因此線程的使用也是比較常見的。由于線程的知識在Win32編程的時候已經說得過多,所以在.Net中很少介紹這部分(可能.Net不覺得這部分是它所特有的)。
那么線程相關的問題大致有如下四類(這篇文章只討論單線程、單線程與UI線程這兩方面的問題)。
問題一,線程的基本操作,例如:暫停、繼續、停止等;
問題二,如何向線程傳遞參數或者從中得到其返回值;
問題三,如何使線程所占用的CPU不要老是百分之百;
最后一個,也是問題最多的,就是如何在子線程來控制UI中的控件,換句話說,就是在線程中控制窗體某些控件的顯示。
對于問題一,我不建議使用Thread類提供的Suspend、Resume以及Abort這三個方法,前兩個有問題,好像在VS05已經屏蔽這兩個方法;對于Abort來說,除了資源沒有得到及時釋放外,有時候會出現異常。如何做呢,通過設置開關變量來完成。
對于問題二,我不建議使用靜態成員來完成,僅僅為了線程而破壞類的封裝有些得不償失。那如何做呢,通過創建單獨的線程類來完成。
對于問題三來說,造成這個原因是由于線程中進行不間斷的循環操作,從而使CPU完全被子線程占有。那么處理此類問題,其實很簡單,在適當的位置調用Thread.Sleep(20)來釋放所占有CPU資源,不要小看這20毫秒的睡眠,它的作用可是巨大的,可以使其他線程得到CPU資源,從而使你的CPU使用效率降下來。
看完前面的三個問題的解釋,對于如何做似乎沒有給出一個明確的答案,為了更好地說明如何解決這三個問題,我用一個比較完整的例子展現給大家,代碼如下。
新聞熱點
疑難解答