日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

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

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

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站制作、成都做網(wǎng)站、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出玉泉免費(fèi)做網(wǎng)站回饋大家。

到這里為止,我們已經(jīng)解決了長(zhǎng)任務(wù)的難題和傳遞參數(shù)的困擾。但是我們真的解決了全部問題嗎?回答是否定的。

C#多線程控制進(jìn)度條之多線程安全的問題:我們知道 Windows 編程中有一個(gè)必須遵守的原則,那就是在一個(gè)窗體創(chuàng)建線程之外的任何線程中都不允許操作窗體。

我們上面的程序就是存在這樣的問題:工作線程是在 ShowProgress 方法中修改了用戶界面的進(jìn)度條的屬性。那為什么程序運(yùn)行沒有出現(xiàn)問題,運(yùn)行正常呢?

沒有發(fā)生問題是因?yàn)槭乾F(xiàn)在的Windows XP操作系統(tǒng)對(duì)這類問題有非常健壯的解決方法,讓我們避免了問題的發(fā)生。但是我們現(xiàn)在的程序不能保證在其他的操作系統(tǒng)能夠運(yùn)行正常!

真正的解決方法是我們能夠認(rèn)識(shí)到問題所在,并在程序中加以避免。

C#多線程控制進(jìn)度條之多線程安全圖

如何避免多線程的窗體資源訪問的安全問題呢?其實(shí)非常簡(jiǎn)單,有兩種方法:

一種方法就是不管線程是否是用戶界面線程,對(duì)用戶界面資源的訪問統(tǒng)一由委托完成;

另一種方法是在每個(gè) Windows Forms 用戶界面類中都有一個(gè) InvokeRequired 屬性,它用來標(biāo)識(shí)當(dāng)前線程是否能夠直接訪問窗體資源。我們只需要檢查這個(gè)屬性的值,只有當(dāng)允許直接訪問窗體資源時(shí)才直接訪問相應(yīng)的資源,否則,就需要通過 委托進(jìn)行訪問了。

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

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

 
 
 
 
  1. // 顯示進(jìn)度條的委托聲明  
  2. delegate void ShowProgressDelegate(  
  3.  int totalStep, int currentStep );  
  4.  
  5. // 顯示進(jìn)度條  
  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 秒 顯示進(jìn)度一次  
  22. for( int i = 0; i < seconds * 4; i++ )  
  23. {  
  24. Thread.Sleep( 250 );  
  25.  
  26. // 顯示進(jìn)度條  
  27. this.Invoke( showProgress,  
  28.  new object[] { seconds * 4, i + 1 } );  
  29. }  

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

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

 
 
 
 
  1. // 顯示進(jìn)度條的委托聲明  
  2. delegate void ShowProgressDelegate(  
  3.  int totalStep, int currentStep );  
  4.  
  5. // 顯示進(jìn)度條  
  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#多線程控制進(jìn)度條之多線程安全
  24.  
  25. // 執(zhí)行任務(wù)的委托聲明  
  26. delegate void RunTaskDelegate( int seconds );  
  27.  
  28. // 執(zhí)行任務(wù)  
  29. void RunTask( int seconds )  
  30. {  
  31. // 每 1 / 4 秒 顯示進(jìn)度一次  
  32. for( int i = 0; i < seconds * 4; i++ )  
  33. {  
  34. Thread.Sleep( 250 );  
  35.  
  36. // 顯示進(jìn)度條  
  37. ShowProgress( seconds * 4, i + 1 );  
  38. } //C#多線程控制進(jìn)度條之多線程安全

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

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

【編輯推薦】

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

分享標(biāo)題:C#多線程控制進(jìn)度條之多線程安全
瀏覽路徑:http://www.5511xx.com/article/cdhhcpd.html