999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

多線程在WinForm窗體開發中的應用研究

2017-05-12 23:36:57周嵐
軟件工程 2017年3期
關鍵詞:用戶方法

周嵐

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

關鍵詞:多線程;假死;委托;BackGroundWorker控件

中圖分類號:TP311.11 文獻標識碼: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型的復雜、耗時操作,去取得我們的應用程序運行所需要的一部分數據[1]。在取得這些數據后,我們需要將它們綁定在UI中呈現。當數據量偏大時,我們會發現窗體變成了空白面板。此時如果用鼠標點擊,窗體標題將會出現“失去響應”的字樣,而實際上UI線程仍在工作著,這對用戶來說是一種極度糟糕的體驗。

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

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

2 線程(Threads)

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

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

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

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

3.1 利用BackGroundWorker 控件解除假死

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

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

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

現在想模擬一個圖片上傳的功能,當點擊上傳按鈕時,彈出“上傳文件進度“對話框;當上傳結束后,對話框自動關閉。如圖2所示。

當文件上傳成功后,調用UI線程上的closeTip方法,關閉窗體2。

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

4 結論(Conclusion)

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

參考文獻(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] 龐麗萍.操作系統原理(第四版)[M].北京:華中科技大學出版社,2015.

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

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

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

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

[9] 秦婧.構建高質量的C#代碼[M].北京:清華大學出版社,2011.

作者簡介:

周 嵐(1977-),女,碩士,副教授.研究領域:程序設計,軟件開發與數據庫.

猜你喜歡
用戶方法
學習方法
關注用戶
商用汽車(2016年11期)2016-12-19 01:20:16
關注用戶
商用汽車(2016年6期)2016-06-29 09:18:54
關注用戶
商用汽車(2016年4期)2016-05-09 01:23:12
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
賺錢方法
捕魚
Camera360:拍出5億用戶
創業家(2015年10期)2015-02-27 07:55:08
100萬用戶
創業家(2015年10期)2015-02-27 07:54:39
主站蜘蛛池模板: 色丁丁毛片在线观看| 亚洲色图欧美激情| 国产成人精品免费av| 色噜噜久久| 亚洲国产精品VA在线看黑人| 夜夜高潮夜夜爽国产伦精品| 狠狠色狠狠综合久久| 伊人久综合| 中文字幕中文字字幕码一二区| 国产福利在线免费观看| 又爽又大又光又色的午夜视频| 四虎永久免费地址在线网站| 99国产精品免费观看视频| 色欲不卡无码一区二区| 国产高清精品在线91| 欧美日韩一区二区三| 亚洲综合片| 久久男人视频| 不卡无码h在线观看| 91亚洲视频下载| 国产成人91精品| 成人午夜网址| 高清不卡毛片| 伊人色在线视频| 中文国产成人久久精品小说| 一本大道香蕉高清久久| 国产jizzjizz视频| 精品国产99久久| 99热这里都是国产精品| 国产Av无码精品色午夜| 国产精品视屏| 亚洲国产中文综合专区在| 韩日午夜在线资源一区二区| 国产一级特黄aa级特黄裸毛片| 五月婷婷综合色| 日韩精品一区二区三区中文无码| 蜜臀av性久久久久蜜臀aⅴ麻豆| 在线播放国产一区| 91九色国产在线| 久久免费观看视频| 免费高清毛片| h网址在线观看| 日韩精品无码免费一区二区三区 | 久久久久免费看成人影片| 国产原创演绎剧情有字幕的| 91亚洲精选| 五月丁香在线视频| 亚洲高清免费在线观看| 欧美一级爱操视频| 青青青国产视频手机| 最新午夜男女福利片视频| 六月婷婷激情综合| 99视频精品在线观看| 国产SUV精品一区二区| 国产亚洲成AⅤ人片在线观看| 青青国产视频| 成人亚洲国产| 色综合久久久久8天国| 精品国产黑色丝袜高跟鞋| 亚洲国产欧美自拍| 国产欧美日韩综合一区在线播放| 欧美日韩专区| 亚洲视频四区| 欧美专区在线观看| 美臀人妻中出中文字幕在线| 最新国产成人剧情在线播放| 色有码无码视频| 国产亚洲美日韩AV中文字幕无码成人| 国产香蕉国产精品偷在线观看| 国产无码高清视频不卡| 好紧好深好大乳无码中文字幕| 欧美在线精品怡红院| 青青草原国产| 国产高潮流白浆视频| 在线综合亚洲欧美网站| 毛片在线播放网址| 高清无码手机在线观看| 免费A∨中文乱码专区| 免费一级α片在线观看| 欧美日本在线播放| 在线观看免费黄色网址| 四虎国产永久在线观看|