新聞中心
C#多線程控制進度條之多線程安全的具體內(nèi)容是什么呢?讓我們開始吧:

公司主營業(yè)務(wù):成都網(wǎng)站制作、成都做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出玉泉免費做網(wǎng)站回饋大家。
到這里為止,我們已經(jīng)解決了長任務(wù)的難題和傳遞參數(shù)的困擾。但是我們真的解決了全部問題嗎?回答是否定的。
C#多線程控制進度條之多線程安全的問題:我們知道 Windows 編程中有一個必須遵守的原則,那就是在一個窗體創(chuàng)建線程之外的任何線程中都不允許操作窗體。
我們上面的程序就是存在這樣的問題:工作線程是在 ShowProgress 方法中修改了用戶界面的進度條的屬性。那為什么程序運行沒有出現(xiàn)問題,運行正常呢?
沒有發(fā)生問題是因為是現(xiàn)在的Windows XP操作系統(tǒng)對這類問題有非常健壯的解決方法,讓我們避免了問題的發(fā)生。但是我們現(xiàn)在的程序不能保證在其他的操作系統(tǒng)能夠運行正常!
真正的解決方法是我們能夠認識到問題所在,并在程序中加以避免。
C#多線程控制進度條之多線程安全圖
如何避免多線程的窗體資源訪問的安全問題呢?其實非常簡單,有兩種方法:
一種方法就是不管線程是否是用戶界面線程,對用戶界面資源的訪問統(tǒng)一由委托完成;
另一種方法是在每個 Windows Forms 用戶界面類中都有一個 InvokeRequired 屬性,它用來標識當(dāng)前線程是否能夠直接訪問窗體資源。我們只需要檢查這個屬性的值,只有當(dāng)允許直接訪問窗體資源時才直接訪問相應(yīng)的資源,否則,就需要通過 委托進行訪問了。
C#多線程控制進度條之多線程安全實現(xiàn):
采用***種安全的方法的代碼片斷如下:
- // 顯示進度條的委托聲明
- delegate void ShowProgressDelegate(
- int totalStep, int currentStep );
- // 顯示進度條
- void ShowProgress( int totalStep, int currentStep )
- {
- _Progress.Maximum = totalStep;
- _Progress.Value = currentStep;
- }
- // 執(zhí)行任務(wù)的委托聲明
- delegate void RunTaskDelegate( int seconds );
- // 執(zhí)行任務(wù)
- void RunTask( int seconds )
- {
- ShowProgressDelegate showProgress =
- new ShowProgressDelegate( ShowProgress );
- // 每 1 / 4 秒 顯示進度一次
- for( int i = 0; i < seconds * 4; i++ )
- {
- Thread.Sleep( 250 );
- // 顯示進度條
- this.Invoke( showProgress,
- new object[] { seconds * 4, i + 1 } );
- }
- }
C#多線程控制進度條之多線程安全實現(xiàn):
采用第二種安全的方法的代碼片斷如下:
- // 顯示進度條的委托聲明
- delegate void ShowProgressDelegate(
- int totalStep, int currentStep );
- // 顯示進度條
- void ShowProgress( int totalStep, int currentStep )
- {
- if( _Progress.InvokeRequired )
- {
- ShowProgressDelegate showProgress =
- new ShowProgressDelegate( ShowProgress );
- // 為了避免工作線程被阻塞,采用異步調(diào)用委托
- this.BeginInvoke(
- showProgress, new object[] {
- totalStep, currentStep } );
- }
- else
- {
- _Progress.Maximum = totalStep;
- _Progress.Value = currentStep;
- }
- } //C#多線程控制進度條之多線程安全
- // 執(zhí)行任務(wù)的委托聲明
- delegate void RunTaskDelegate( int seconds );
- // 執(zhí)行任務(wù)
- void RunTask( int seconds )
- {
- // 每 1 / 4 秒 顯示進度一次
- for( int i = 0; i < seconds * 4; i++ )
- {
- Thread.Sleep( 250 );
- // 顯示進度條
- ShowProgress( seconds * 4, i + 1 );
- } //C#多線程控制進度條之多線程安全
- }
至此,我們用了幾個示例說明了如何執(zhí)行長任務(wù)、如何通過多線程異步處理任務(wù)進度的顯示并解決了多線程的安全性等問題。希望能夠給大家對理解多線程編程、委托的使用、異步調(diào)用等方面提供一些幫助,也希望能和大家進行進一步的溝通和交流。
C#多線程控制進度條之多線程安全相關(guān)的內(nèi)容就向你介紹到這里,希望對你了解和學(xué)習(xí)C#多線程控制進度條之多線程安全有所幫助。
【編輯推薦】
- C#進度條之控制臺顯示淺析
- C# WinForm進度條實現(xiàn)淺析
- C#多線程控制進度條之長任務(wù)操作
- C#多線程控制進度條之長異步操作
- C#多線程控制進度條之異步調(diào)用
網(wǎng)頁標題:C#多線程控制進度條之多線程安全
本文來源:http://www.dlmjj.cn/article/cdhhcpd.html


咨詢
建站咨詢
