


下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C#使用多線程使軟件界面具有較好的響應(yīng)性軟件界面的響應(yīng)特性是判斷一款軟件的非常重要的方面。一般來說,不管你軟件功能做得有多么奇妙,如果軟件有一點(diǎn)點(diǎn)死機(jī)的感覺都會(huì)讓用戶感到很討厭,甚至懷疑你軟件里是否藏有更大的問題。要提高界面的響應(yīng)特性,最好的辦法莫過于使用多線程,并把呈現(xiàn)界面的線程獨(dú)立出來。以前只有使用C+才能實(shí)現(xiàn)的多線程功能,現(xiàn)在在.Net框架下,所有的語言(包括VB)都可以使用了。不過,使用多線程比使用單一線程要麻煩得多,比如線程之間的同步問題,做得不好很容易出錯(cuò),而有的時(shí)候這種錯(cuò)誤要開發(fā)人員花上幾個(gè)星期的時(shí)間才能找到。在Windows Form軟件中使用多線程更是有一些限制。下面我們就把
2、在Windows Form軟件中使用多線程要注意的問題給大家做一個(gè)介紹。首先,什么樣的操作需要考慮使用多線程?總的一條就是,負(fù)責(zé)與用戶交互的線程(以下簡稱為UI線程)應(yīng)該保持順暢,當(dāng)UI線程調(diào)用的API可能引起阻塞時(shí)間超過30毫秒時(shí)(比如訪問CD-ROM等速度超慢的外設(shè)、進(jìn)行遠(yuǎn)程調(diào)用等等)就應(yīng)該考慮使用多線程。為什么是30毫秒?30毫秒的概念是人眼可以察覺到的一個(gè)遲滯,大約等同于電影里的一幀停留的時(shí)間,最長不要超過100毫秒。第二,最方便和簡單的多線程是使用線程池。通過線程池里的線程運(yùn)行代碼的最簡便方法則是使用異步委托調(diào)用。注意委托調(diào)用通常是同步完成的,請(qǐng)使用BeginInvoke方法,這樣就
3、可以把要調(diào)用的方法排隊(duì)到線程池里等候處理,而程序的流程會(huì)立刻返回到調(diào)用方(此處是UI線程),而調(diào)用方因此不會(huì)出現(xiàn)阻塞。private void StartSomeWorkFromUIThread () / 我們要做的工作相對(duì)UI線程而言臺(tái)慢了,用下面的方法異步進(jìn)行處理MethodInvoker mi = new MethodInvoker(RunsOnWorkerThread);/這是入口方法mi.BeginInvoke(null, null); / 這樣就不會(huì)阻塞/ 緩慢的工作在此方法內(nèi)進(jìn)行處理,使用線程池里的線程private void RunsOnWorkerThread() DoSom
4、ethingSlow();歸納上述方法,對(duì)UI線程而言實(shí)際上就是:1、發(fā)出調(diào)用,2、立刻返回,具體運(yùn)行過程不理了,這樣UI線程就不會(huì)被阻塞。這種方法很重要,下面我們會(huì)深入介紹。除了上面的方法,還有其他使用線程池的方法,當(dāng)然如果你高興也可以自己創(chuàng)建線程。/ 這是由UI線程定義的Label控件private Label lblStatus;./ 以下方法不在UI線程上執(zhí)行private void RunsOnWorkerThread() DoSomethingSlow();lblStatus.Text = "Finished!" / 這是錯(cuò)的第四,由于上述限制,我們可能會(huì)感到很
5、不方便,的確,當(dāng)我們利用一個(gè)新創(chuàng)建的線程來執(zhí)行某些花時(shí)間的運(yùn)算時(shí),怎樣知道運(yùn)算進(jìn)度如何并通過UI反映給用戶呢?解決方法很多!比如熟悉多線程編程的用戶很快會(huì)想到,我們采用一些低級(jí)的同步方法,工作者線程把狀態(tài)保存到一個(gè)同步對(duì)象中,讓UI線程輪詢(Polling)該對(duì)象并反饋給用戶就可以了。不過,這還是挺麻煩的,實(shí)際上不用這樣做,Control類(及其派生類)對(duì)象有一個(gè)Invoke方法很特別,這是少數(shù)幾個(gè)不受線程限制的成員之一。我們前面說到,絕對(duì)不要在任何其他線程里面調(diào)用非本線程創(chuàng)建的控件的成員時(shí),也說了“只有極個(gè)別情況例外”,這個(gè)Invoke方法就是極個(gè)別情況之一-Invoke方法可以從任何線程里
6、面調(diào)用。下面我們來講解Invoke方法。Invoke方法的參數(shù)很簡單,一個(gè)委托,一個(gè)參數(shù)表(可選),而Invoke方法的主要功能就是幫助你在UI線程(即創(chuàng)建控件的線程)上調(diào)用委托所指定的方法。Invoke方法首先檢查發(fā)出調(diào)用的線程(即當(dāng)前線程)是不是UI線程,如果是,直接執(zhí)行委托指向的方法,如果不是,它將切換到UI線程,然后執(zhí)行委托指向的方法。不管當(dāng)前線程是不是UI線程,Invoke都阻塞直到委托指向的方法執(zhí)行完畢,然后切換回發(fā)出調(diào)用的線程(如果需要的話),返回。注意,使用Invoke方法時(shí),UI線程不能處于阻塞狀態(tài)。以下MSDN里關(guān)于Invoke方法的說明:“控件上有四種方法可以安全地從任何
7、線程進(jìn)行調(diào)用:Invoke、BeginInvoke、EndInvoke 和 CreateGraphics。對(duì)于所有其他方法調(diào)用,則應(yīng)使用調(diào)用 (invoke) 方法之一封送對(duì)控件的線程的調(diào)用。委托可以是 EventHandler 的實(shí)例,在此情況下,發(fā)送方參數(shù)將包含此控件,而事件參數(shù)將包含 EventArgs.Empty。委托還可以是 MethodInvoker 的實(shí)例或采用 void 參數(shù)列表的其他任何委托。調(diào)用 EventHandler 或 MethodInvoker 委托比調(diào)用其他類型的委托速度更快?!毕旅嫖覀兝盟鶎W(xué)到的知識(shí)來改寫上面那個(gè)簡單的例子:/ 這是由UI線程定義的Label控件private Label lblStatus;./ 以下方法不在UI線程上執(zhí)行private void RunsOnWorkerThread() DoSomethingSlow();/ Do UI update on UI threadlblStatus.BeginInvoke(new System.EventHandler(UpdateUI), pList);./ 切換回UI線程執(zhí)行的入口private void UpdateUI(object o, System.EventArgs e) /現(xiàn)在沒問題了,使用Invo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑工程安全管理與質(zhì)量控制
- 職業(yè)生涯規(guī)劃培訓(xùn)課程大綱
- 探索校園文化與科技的結(jié)合點(diǎn)推動(dòng)學(xué)生產(chǎn)品設(shè)計(jì)
- 教育與職業(yè)發(fā)展的融合趨勢(shì)
- 教育培訓(xùn)體系建設(shè)與完善方案
- 拼多多的商業(yè)模型分析與優(yōu)化建議
- 教學(xué)設(shè)計(jì)中培養(yǎng)學(xué)生的創(chuàng)新能力研究
- 影視制作行業(yè)的發(fā)展及技術(shù)趨勢(shì)解析
- 快速提升設(shè)計(jì)水平的技巧
- 影視產(chǎn)業(yè)電影產(chǎn)業(yè)發(fā)展與市場(chǎng)分析
- 2025長沙市輔警考試試卷真題帶答案
- 胸痛健康教育課件
- 2025年合肥城建發(fā)展股份有限公司及所屬子公司招聘17人(二批次)筆試參考題庫附帶答案詳解
- 2025年項(xiàng)目終止協(xié)議
- 醫(yī)院員工手冊(cè)管理制度
- 2024大華網(wǎng)絡(luò)攝像機(jī)使用說明書全集
- 泉州水務(wù)集團(tuán)有限公司招聘考試真題2024
- 東航客運(yùn)崗位面試題目及答案
- 《貝聿銘建筑設(shè)計(jì)》課件
- 三級(jí)營養(yǎng)師考試復(fù)習(xí)重點(diǎn)題(附答案)
- 2025裝配式混凝土居住建筑首個(gè)標(biāo)準(zhǔn)層段聯(lián)合驗(yàn)收規(guī)程
評(píng)論
0/150
提交評(píng)論