C#中怎么实现多线程安全,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
C#多线程控制进度条之多线程安全的问题:我们知道 Windows 编程中有一个必须遵守的原则,那就是在一个窗体创建线程之外的任何线程中都不允许操作窗体。
我们上面的程序就是存在这样的问题:工作线程是在 ShowProgress 方法中修改了用户界面的进度条的属性。那为什么程序运行没有出现问题,运行正常呢?
没有发生问题是因为是现在的Windows XP操作系统对这类问题有非常健壮的解决方法,让我们避免了问题的发生。但是我们现在的程序不能保证在其他的操作系统能够运行正常!
真正的解决方法是我们能够认识到问题所在,并在程序中加以避免。
C#多线程控制进度条之多线程安全图
如何避免多线程的窗体资源访问的安全问题呢?其实非常简单,有两种方法:
一种方法就是不管线程是否是用户界面线程,对用户界面资源的访问统一由委托完成;
另一种方法是在每个 Windows Forms 用户界面类中都有一个 InvokeRequired 属性,它用来标识当前线程是否能够直接访问窗体资源。我们只需要检查这个属性的值,只有当允许直接访问窗体资源时才直接访问相应的资源,否则,就需要通过 委托进行访问了。
C#多线程控制进度条之多线程安全实现:
采用***种安全的方法的代码片断如下:
// 显示进度条的委托声明 delegate void ShowProgressDelegate( int totalStep, int currentStep ); // 显示进度条 void ShowProgress( int totalStep, int currentStep ) { _Progress.Maximum = totalStep; _Progress.Value = currentStep; } // 执行任务的委托声明 delegate void RunTaskDelegate( int seconds ); // 执行任务 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#多线程控制进度条之多线程安全实现:
采用第二种安全的方法的代码片断如下:
// 显示进度条的委托声明 delegate void ShowProgressDelegate( int totalStep, int currentStep ); // 显示进度条 void ShowProgress( int totalStep, int currentStep ) { if( _Progress.InvokeRequired ) { ShowProgressDelegate showProgress = new ShowProgressDelegate( ShowProgress ); // 为了避免工作线程被阻塞,采用异步调用委托 this.BeginInvoke( showProgress, new object[] { totalStep, currentStep } ); } else { _Progress.Maximum = totalStep; _Progress.Value = currentStep; } } //C#多线程控制进度条之多线程安全 // 执行任务的委托声明 delegate void RunTaskDelegate( int seconds ); // 执行任务 void RunTask( int seconds ) { // 每 1 / 4 秒 显示进度一次 for( int i = 0; i < seconds * 4; i++ ) { Thread.Sleep( 250 ); // 显示进度条 ShowProgress( seconds * 4, i + 1 ); } //C#多线程控制进度条之多线程安全}
至此,我们用了几个示例说明了如何执行长任务、如何通过多线程异步处理任务进度的显示并解决了多线程的安全性等问题。希望能够给大家对理解多线程编程、委托的使用、异步调用等方面提供一些帮助,也希望能和大家进行进一步的沟通和交流。
看完上述内容,你们掌握C#中怎么实现多线程安全的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。