自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C#多線程控制進度條之多線程安全

開發(fā) 后端
C#多線程控制進度條之多線程安全具體的是什么情況呢?C#多線程控制進度條之多線程安全都有哪些是需要注意的呢?那么本文就向你介紹這些相關(guān)的內(nèi)容。

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

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

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

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

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

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

C#多線程控制進度條之多線程安全 

C#多線程控制進度條之多線程安全圖

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

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

另一種方法是在每個 Windows Forms 用戶界面類中都有一個 InvokeRequired 屬性,它用來標識當前線程是否能夠直接訪問窗體資源。我們只需要檢查這個屬性的值,只有當允許直接訪問窗體資源時才直接訪問相應(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. forint 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. forint 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)容就向你介紹到這里,希望對你了解和學習C#多線程控制進度條之多線程安全有所幫助。

【編輯推薦】

  1. C#進度條之控制臺顯示淺析
  2. C# WinForm進度條實現(xiàn)淺析
  3. C#多線程控制進度條之長任務(wù)操作
  4. C#多線程控制進度條之長異步操作
  5. C#多線程控制進度條之異步調(diào)用
責任編輯:仲衡 來源: 博客園
相關(guān)推薦

2009-08-17 16:29:56

C#多線程控制

2009-08-17 16:41:03

C#多線程控制

2009-08-17 16:49:46

C#多線程控制

2009-08-17 14:08:33

C#進度條使用

2021-03-05 07:38:52

C++線程編程開發(fā)技術(shù)

2023-06-05 07:56:10

線程分配處理器

2023-06-06 08:17:52

多線程編程Thread類

2009-08-28 16:51:32

C#線程控制

2023-06-13 13:39:00

多線程異步編程

2009-08-12 18:04:44

編寫C#多線程

2011-06-24 11:12:39

Qt 多線程 線程

2009-08-28 16:43:57

C#多線程學習

2009-09-04 15:09:48

C#多線程啟動Squa

2011-08-18 17:07:23

IOS開發(fā)多線程NSInvocatio

2025-02-27 08:15:28

2009-08-17 15:05:41

C#進度條

2024-10-21 16:59:37

C#編程多線程

2009-07-17 10:37:05

C#多線程

2009-08-26 18:13:55

C#多線程lock

2011-04-25 14:42:10

C#lock
點贊
收藏

51CTO技術(shù)棧公眾號