采用第一种安全的方法的代码片断如下:
// 显示进度条的委托声明 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 } ); } } 采用第二种安全的方法的代码片断如下:
// 显示进度条的委托声明 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; } }
// 执行任务的委托声明 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 ); } } 至此,我们用了几个示例说明了如何执行长任务、如何通过多线程异步处理任务进度的显示并解决了多线程的安全性等问题。希望能够给大家对理解多线程编程、委托的使用、异步调用等方面提供一些帮助,也希望能和大家进行进一步的沟通和交流。
示例程序下载:(附件)
|