日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C#多線程控制進度條之多線程安全

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):

采用***種安全的方法的代碼片斷如下:

 
 
 
 
  1. // 顯示進度條的委托聲明  
  2. delegate void ShowProgressDelegate(  
  3.  int totalStep, int currentStep );  
  4.  
  5. // 顯示進度條  
  6. void ShowProgress( int totalStep, int currentStep )  
  7. {  
  8. _Progress.Maximum = totalStep;  
  9. _Progress.Value = currentStep;  
  10. }  
  11.  
  12. // 執(zhí)行任務(wù)的委托聲明  
  13. delegate void RunTaskDelegate( int seconds );  
  14.  
  15. // 執(zhí)行任務(wù)  
  16. void RunTask( int seconds )  
  17. {  
  18. ShowProgressDelegate showProgress =   
  19. new ShowProgressDelegate( ShowProgress );  
  20.  
  21. // 每 1 / 4 秒 顯示進度一次  
  22. for( int i = 0; i < seconds * 4; i++ )  
  23. {  
  24. Thread.Sleep( 250 );  
  25.  
  26. // 顯示進度條  
  27. this.Invoke( showProgress,  
  28.  new object[] { seconds * 4, i + 1 } );  
  29. }  

C#多線程控制進度條之多線程安全實現(xiàn):

采用第二種安全的方法的代碼片斷如下:

 
 
 
 
  1. // 顯示進度條的委托聲明  
  2. delegate void ShowProgressDelegate(  
  3.  int totalStep, int currentStep );  
  4.  
  5. // 顯示進度條  
  6. void ShowProgress( int totalStep, int currentStep )  
  7. {  
  8. if( _Progress.InvokeRequired )  
  9. {  
  10. ShowProgressDelegate showProgress =   
  11. new ShowProgressDelegate( ShowProgress );  
  12.  
  13. // 為了避免工作線程被阻塞,采用異步調(diào)用委托  
  14. this.BeginInvoke(   
  15. showProgress, new object[] {   
  16. totalStep, currentStep } );  
  17. }  
  18. else 
  19. {  
  20. _Progress.Maximum = totalStep;  
  21. _Progress.Value = currentStep;  
  22. }  
  23. }  //C#多線程控制進度條之多線程安全
  24.  
  25. // 執(zhí)行任務(wù)的委托聲明  
  26. delegate void RunTaskDelegate( int seconds );  
  27.  
  28. // 執(zhí)行任務(wù)  
  29. void RunTask( int seconds )  
  30. {  
  31. // 每 1 / 4 秒 顯示進度一次  
  32. for( int i = 0; i < seconds * 4; i++ )  
  33. {  
  34. Thread.Sleep( 250 );  
  35.  
  36. // 顯示進度條  
  37. ShowProgress( seconds * 4, i + 1 );  
  38. } //C#多線程控制進度條之多線程安全

至此,我們用了幾個示例說明了如何執(zhí)行長任務(wù)、如何通過多線程異步處理任務(wù)進度的顯示并解決了多線程的安全性等問題。希望能夠給大家對理解多線程編程、委托的使用、異步調(diào)用等方面提供一些幫助,也希望能和大家進行進一步的溝通和交流。

C#多線程控制進度條之多線程安全相關(guān)的內(nèi)容就向你介紹到這里,希望對你了解和學(xué)習(xí)C#多線程控制進度條之多線程安全有所幫助。

【編輯推薦】

  1. C#進度條之控制臺顯示淺析
  2. C# WinForm進度條實現(xiàn)淺析
  3. C#多線程控制進度條之長任務(wù)操作
  4. C#多線程控制進度條之長異步操作
  5. C#多線程控制進度條之異步調(diào)用

網(wǎng)頁標題:C#多線程控制進度條之多線程安全
本文來源:http://www.dlmjj.cn/article/cdhhcpd.html