国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

多線程在WinForm窗體開發(fā)中的應(yīng)用研究

2017-05-12 23:36周嵐
軟件工程 2017年3期
關(guān)鍵詞:窗體控件線程

周嵐

摘 要:通常我們使用異步完成許多計算型的耗時操作,取得應(yīng)用程序運行所需要的部分?jǐn)?shù)據(jù),再將它們綁定在UI中呈現(xiàn),這個過程由于數(shù)據(jù)量偏大,窗體會出現(xiàn)“失去響應(yīng)”的情況,而線程技術(shù)的使用可以方便的實現(xiàn)并發(fā)執(zhí)行,提升資源的利用率,提高程序處理效率,解除“假死”這種糟糕的體驗。本文通過對C#多線程技術(shù)及委托方法的介紹,分析研究了在WinForm窗體開發(fā)中解決假死狀態(tài)的兩種方法,給出實例及相關(guān)代碼,并對這兩種方法的特點進(jìn)行了總結(jié)。

關(guān)鍵詞:多線程;假死;委托;BackGroundWorker控件

中圖分類號:TP311.11 文獻(xiàn)標(biāo)識碼:A

Abstract:Asynchronous manners are usually adopted to implement lots of time-consuming computing operation,in order to achieve the data required by the application and bind them to be presented in UI.Due to the great amount of data,the form often stops responding.The multi-thread technology can facilitate the implementation of concurrency,promote the resource utilization,improve processing efficiency,and avoid the terrible experience of "suspended animation".Based on the C# multi-thread technology and principal methods,the paper analyzes two solutions to the problems of suspended animation in the WinForm development,provides examples and related code,and summarizes the characteristics of two solutions.

Keywords:multi-threading;suspended animation;commission;BackGroundWorker widget

1 引言(Introduction)

通常我們使用異步完成許多計算型、IO型的復(fù)雜、耗時操作,去取得我們的應(yīng)用程序運行所需要的一部分?jǐn)?shù)據(jù)[1]。在取得這些數(shù)據(jù)后,我們需要將它們綁定在UI中呈現(xiàn)。當(dāng)數(shù)據(jù)量偏大時,我們會發(fā)現(xiàn)窗體變成了空白面板。此時如果用鼠標(biāo)點擊,窗體標(biāo)題將會出現(xiàn)“失去響應(yīng)”的字樣,而實際上UI線程仍在工作著,這對用戶來說是一種極度糟糕的體驗。

我們打個比方:比如在上傳圖片的時候,我們會對上傳成功的圖片再進(jìn)行一些相關(guān)的處理,一般保存原圖,再生成一張小圖給一些應(yīng)用做預(yù)覽圖。如果讀取原圖再處理的過程由應(yīng)用程序?qū)崿F(xiàn),讀取原圖需要時間為1秒,處理圖片需要2秒,現(xiàn)在有5張大圖,所需要花費的時間就是(1+2)*5=15秒,根據(jù)圖片的不同,那么單位時間會更多,總計時間就會更久,如果有一百萬張圖要進(jìn)行相同的處理,那么我們等待的時間將會是15*1000000秒,大約是174天,這種等待是不是有點兒無法忍受。

那么,我們是不是可以把程序設(shè)計更好一點兒,讓應(yīng)用程序在讀取文件的時候同時處理上一個已讀入的文件,這樣就好像是同時在做兩件事情,一邊燒開水,一邊打毛衣,可以盡可能的縮短時間。多線程的引入可以幫助應(yīng)用程序?qū)崿F(xiàn)這種更理想的狀態(tài),減少客戶端的響應(yīng),同時也提升了CPU的使用率。

2 線程(Threads)

在CPU制造工藝已經(jīng)達(dá)到了物理極限的今天,除非技術(shù)有質(zhì)的突破來進(jìn)一步提高處理器的速度,但是,我們所要處理的數(shù)據(jù)量卻沒有一刻停止它飛速增長的腳步,所以,并行處理技術(shù)將成為未來發(fā)現(xiàn)的趨勢,并行處理技術(shù)的核心是對線程的操作[2]。線程,作為輕量級進(jìn)程(Lightweight Process,LWP),是程序執(zhí)行流的最小單元,多線程是指從軟件或者硬件上實現(xiàn)多個線程并發(fā)執(zhí)行的技術(shù)。

其實,在開發(fā)的應(yīng)用軟件中,大多數(shù)線程的數(shù)量都不止一個,多個線程可以并發(fā)的執(zhí)行,共享進(jìn)程的全局變量和堆的數(shù)據(jù)。它的優(yōu)勢在于,當(dāng)某個操作陷入長時間的等待,或者,一些計算可能會消耗大量的時間,這時會出現(xiàn)和用戶之間的交互中斷,如果采用多線程,一個線程等待(負(fù)責(zé)計算)的時候,其他線程可以執(zhí)行(另一個線程負(fù)責(zé)交互),保證CUP的利用率[3]。下面我們來具體看看,多線程在WinForm窗體開發(fā)中是如何解除假死的。

3 解決假死的方法(The method to solve the dead)

什么是假死呢?凡是WinForm的應(yīng)用程序,如果程序執(zhí)行的是一個非常冗長的處理操作(比如文件查詢、批量的計算、大量文件的上傳或下載等),程序在執(zhí)行的時候,用戶界面會被鎖定,雖然主活動窗口一直在運行,但用戶沒有辦法與程序進(jìn)行交互,窗體的位置和大小也不能移動和改變,就好像“死”在那里不能動一樣,用戶不能產(chǎn)生良好的使用體驗[4]。如何做才能使得這個程序有響應(yīng),消除這種“假死”的狀態(tài)呢?答案就是在后臺線程中執(zhí)行這個操作?,F(xiàn)在介紹兩種方法來消除這種“假死”的現(xiàn)象。一種是利用BackgroundWorker控件實現(xiàn);另一種是采用線程加委托的方法消除“假死”。下面我們分別來進(jìn)行介紹。

3.1 利用BackGroundWorker 控件解除假死

使用BackgroundWorker控件可以在后臺單獨的線程上執(zhí)行操作,通常用于數(shù)據(jù)庫操作、文件下載等相對耗時一般要求后臺處理的任務(wù),使用起來比較簡單[5]?,F(xiàn)在我們用BackGroundWorker控件設(shè)計一個模擬1000個文件復(fù)制過程的進(jìn)度條,當(dāng)我們點擊“文件復(fù)制模擬”按鈕時,進(jìn)度條會顯示“正在復(fù)制”字樣,以及完成復(fù)制的百分比,如圖1所示,這樣做的好處是:用戶可以隨時了解應(yīng)用程序執(zhí)行的進(jìn)度,而不至于陷入盲目焦躁的等待。

3.2 采用線程加委托的方法解決假死

前面我們說過,在winform開發(fā)時,如果要對某控件顯示的內(nèi)容進(jìn)行操作,而這些內(nèi)容的來源很耗時,會阻塞UI主線程,造成界面的假死,在操作完成之前,界面是不能接收任何響應(yīng)的。我們可以采用線程+異步委托的方法來確保,即便是耗時的數(shù)據(jù)操作也不會影響UI的顯示和操作的流暢性[6]。

現(xiàn)在想模擬一個圖片上傳的功能,當(dāng)點擊上傳按鈕時,彈出“上傳文件進(jìn)度“對話框;當(dāng)上傳結(jié)束后,對話框自動關(guān)閉。如圖2所示。

當(dāng)文件上傳成功后,調(diào)用UI線程上的closeTip方法,關(guān)閉窗體2。

跨線程直接訪問控件在C#中是被禁止,還好我們有InvokeRequired,用它就可以解決這個問題。當(dāng)一個控件的InvokeRequired屬性值為真時,說明有一個創(chuàng)建它以外的線程想訪問它。此時它將會在內(nèi)部調(diào)用new MethodInvoker(LoadGlobalImage)來完成下面的步驟,這個做法保證了控件的安全[7]。舉個例子更如易理解,假如有人想找你借錢,他可以直接在你的錢包中拿嗎?這樣是不是太不安全了?所以,必須讓別人先要告訴你,你再從自己的錢包把錢拿出來借給別人,這樣更安全,也更合乎邏輯。

4 結(jié)論(Conclusion)

本文通過對C#多線程技術(shù)及委托方法的介紹,分析了在WinForm窗體開發(fā)中出現(xiàn)假死狀態(tài)的原因,并且詳細(xì)的說明了如何使用BackGroundWorker控件解除假死,以及如何采用線程加異步委托的方法解決假死。當(dāng)然,在實際的開發(fā)過程中解除假死的方法還有很多,比如我們也可以利用Application.DoEvents()來解決這個問題[8]。當(dāng)然,多線程并非是程序員的圣杯,使用起來也并非一勞永逸,它的使用會增加的內(nèi)存負(fù)擔(dān)、要求CUP有更強的處理能力、“死鎖”也是不可回避的、如果不使用合理的同步結(jié)構(gòu),以保證獨占的數(shù)據(jù)訪問方式,那么,數(shù)據(jù)損壞也是多線程處理所要面對的一個巨大問題等等。對于以上問題,我們可以對此進(jìn)行更深入的研究[9]。隨著制造水平的提高和技術(shù)的發(fā)展,CPU已經(jīng)進(jìn)入了超線程、多核的時代,相信在不久的未來,我們一定可以用更優(yōu)化的方式,設(shè)計出更加實用的、高效的應(yīng)用程序,帶給用戶全新的操作體驗。

參考文獻(xiàn)(References)

[1] CAI Yunfei,TANG Zhenmin,ZHAO Chunxia.New Layered SOA-Based Architecture for Multi-Robots Cooperative Online SLAM[J].Chinese Journal of Electronics,2014, 01:25-30.

[2] Chen.S.M.,J.M.Tan.Handling Multicriteria Fuzzy Decision-Making Problems Based on VagueSet-Theory[J].Fuzzy SetsandSystems,1994,67(2):163-172.

[3] Colvin,J.,Tobler,N.,Anderson,J.A..Productivity and Multiscreen Computer Displays[J].Rocky Mountain Communication Review,2007,2(01):31-53.

[4] 龐麗萍.操作系統(tǒng)原理(第四版)[M].北京:華中科技大學(xué)出版社,2015.

[5] (美)斯托林斯.陳向群,譯.操作系統(tǒng):精髓與設(shè)計原理(原書第6版)[M].北京:機(jī)械工業(yè)出版社,2010.

[6] (美)Andrew Troelsen.精通C#(第6版)[M].北京:人民郵電出版社,2013.

[7] (英)里·麥克萊恩·霍爾(Gary McLean Hall).C#敏捷開發(fā)實踐[M].北京:人民郵電出版社,2016.

[8] (美)阿壩哈瑞,(美)阿壩哈瑞.著果殼中的C#——C#50權(quán)威指南[M].北京:水利水電出版社,2013.

[9] 秦婧.構(gòu)建高質(zhì)量的C#代碼[M].北京:清華大學(xué)出版社,2011.

作者簡介:

周 嵐(1977-),女,碩士,副教授.研究領(lǐng)域:程序設(shè)計,軟件開發(fā)與數(shù)據(jù)庫.

猜你喜歡
窗體控件線程
試談Access 2007數(shù)據(jù)庫在林業(yè)檔案管理中的應(yīng)用
關(guān)于.net控件數(shù)組的探討
淺談linux多線程協(xié)作
ASP.NET服務(wù)器端驗證控件的使用
巧設(shè)WPS窗體控件讓表格填寫更規(guī)范
基于上下文定界的Fork/Join并行性的并發(fā)程序可達(dá)性分析*
Linux線程實現(xiàn)技術(shù)研究
基于嵌入式MINIGUI控件子類化技術(shù)的深入研究與應(yīng)用
么移動中間件線程池并發(fā)機(jī)制優(yōu)化改進(jìn)
WinCE.net下圖形用戶界面的開發(fā)