C#多线程控制进度条之多线程安全

C#多线程控制进度条之多线程安全的具体内容是什么呢?让我们开始吧:

公司主营业务:成都网站制作、成都做网站、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出玉泉免费做网站回馈大家。

到这里为止,我们已经解决了长任务的难题和传递参数的困扰。但是我们真的解决了全部问题吗?回答是否定的。

C#多线程控制进度条之多线程安全的问题:我们知道 Windows 编程中有一个必须遵守的原则,那就是在一个窗体创建线程之外的任何线程中都不允许操作窗体。

我们上面的程序就是存在这样的问题:工作线程是在 ShowProgress 方法中修改了用户界面的进度条的属性。那为什么程序运行没有出现问题,运行正常呢?

没有发生问题是因为是现在的Windows XP操作系统对这类问题有非常健壮的解决方法,让我们避免了问题的发生。但是我们现在的程序不能保证在其他的操作系统能够运行正常!

真正的解决方法是我们能够认识到问题所在,并在程序中加以避免。

C#多线程控制进度条之多线程安全图

如何避免多线程的窗体资源访问的安全问题呢?其实非常简单,有两种方法:

一种方法就是不管线程是否是用户界面线程,对用户界面资源的访问统一由委托完成;

另一种方法是在每个 Windows Forms 用户界面类中都有一个 InvokeRequired 属性,它用来标识当前线程是否能够直接访问窗体资源。我们只需要检查这个属性的值,只有当允许直接访问窗体资源时才直接访问相应的资源,否则,就需要通过 委托进行访问了。

C#多线程控制进度条之多线程安全实现:

采用***种安全的方法的代码片断如下:

 
 
 
 
  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. // 执行任务的委托声明  
  13. delegate void RunTaskDelegate( int seconds );  
  14.  
  15. // 执行任务  
  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#多线程控制进度条之多线程安全实现:

采用第二种安全的方法的代码片断如下:

 
 
 
 
  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. // 为了避免工作线程被阻塞,采用异步调用委托  
  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. // 执行任务的委托声明  
  26. delegate void RunTaskDelegate( int seconds );  
  27.  
  28. // 执行任务  
  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#多线程控制进度条之多线程安全

至此,我们用了几个示例说明了如何执行长任务、如何通过多线程异步处理任务进度的显示并解决了多线程的安全性等问题。希望能够给大家对理解多线程编程、委托的使用、异步调用等方面提供一些帮助,也希望能和大家进行进一步的沟通和交流。

C#多线程控制进度条之多线程安全相关的内容就向你介绍到这里,希望对你了解和学习C#多线程控制进度条之多线程安全有所帮助。

【编辑推荐】

  1. C#进度条之控制台显示浅析
  2. C# WinForm进度条实现浅析
  3. C#多线程控制进度条之长任务操作
  4. C#多线程控制进度条之长异步操作
  5. C#多线程控制进度条之异步调用

本文名称:C#多线程控制进度条之多线程安全
浏览路径:http://www.hantingmc.com/qtweb/news17/292517.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联