线程系列10,无需显式调用线程的情形

王朝学院·作者佚名  2016-05-17
窄屏简体版  字體: 小  |  中  |  大  |  超大  

线程系列10,无需显式调用线程的情形通常,我们会通过线程的构造函数先创建线程再使用线程。而实际上,.NET中有些类提供的方法,其内部就是使用多线程处理的。一些封装了多线程、异步处理方法的类都符合了"事件驱动异步模式(event-based asynchronous pattern)"。以System.ComponentModel下的BackgroundWorker类来说,该类就符合这种模式。

BackgroundWorker类属性:WorkerSupportsCancellation:设置为true表示允许取消WorkerReportPRogress:设置为true表示可显示进度

BackgroundWorker类事件:DoWork:后台线程要做的事ProgressChanged:进度触发事件RunWorkerCompleted:当进度结束、抛出异常、或取消执行时触发

举例,在Windows窗体应用程序中使用BackgroundWorker类。

→新建一个Windows窗体应用程序,界面包括2个button,1个label,1个progressbar,1个BackgournWorker控件。

→设置BackgournWorker控件的WorkerSupportsCancellation属性和WorkerReportProgress为true。

→后台代码为:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)

{

int sum = 0;

for (int i = 1; i <=100; i++)

{

Thread.Sleep(1000);

sum = sum + 1;

backgroundWorker1.ReportProgress(i);

//如果取消计算

if (backgroundWorker1.CancellationPending)

{

e.Cancel = true;

backgroundWorker1.ReportProgress(0);

return;

}

e.Result = sum;

}

}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)

{

//把BackgroundWorker的进程体现到ProgressBar上

progressBar1.Value = e.ProgressPercentage;

//把BackgroundWorker的进程体现到label上

label1.Text = e.ProgressPercentage + "%";

}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

{

if (e.Cancelled) //可能以取消的方式结束

{

label1.Text = "计算被取消";

}

else if (e.Error != null)//可能以抛出异常的方式结束

{

label1.Text = e.Error.Message;

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航