今天看到别人的博客中提到了BackgroundWorker组件。在现在的系统中有见到过这个组件,由于实际应用的系统中逻辑比较复杂所以也没深入去看。今天凑巧看到了一个关于BackgroundWorker组件的例子,对原代码中存在的问题进行了一下修改。自己也学习了一下。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace BackGroundWorkerDemo { public partial class Form1 : Form { public Form1() { InitializeComponent(); backgroundWorker1.WorkerReportsProgress = true;//报告进度 backgroundWorker1.WorkerSupportsCancellation = true;//支持取消异步进程 progressBar1.Maximum = 10000;//进度条的最大值设置要与其真实要显示的值相对应。 backgroundWorker1.ProgressChanged+=new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); backgroundWorker1.RunWorkerCompleted+=new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); backgroundWorker1.DoWork+=new DoWorkEventHandler(backgroundWorker1_DoWork); } private void button1_Click(object sender, EventArgs e) { backgroundWorker1.RunWorkerAsync(); } private void button2_Click(object sender, EventArgs e) { backgroundWorker1.CancelAsync(); } private void button3_Click(object sender, EventArgs e) { this.Close(); } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { this.progressBar1.Value = e.ProgressPercentage; this.label1.Text = e.UserState.ToString(); //由于lable的值更新的特别快,此时只是对text属性赋值的话,label也并不能及时ReDraw显示。所以要强制对控件进行刷新 //可以用label继承的Control的Update方法,也可以用Refresh(),二者均可以强制重绘控件,进行刷新 this.label1.Update(); //this.label1.Refresh(); } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { MessageBox.Show(@"运算完成"); } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { work(this.backgroundWorker1); } private bool work(BackgroundWorker bk) { int tatle = 10000; for (int i = 0; i < tatle; i++) { if (bk.CancellationPending) //这里判断一下是否用户要求取消后台进行,并可以尽早退出。 { bk.ReportProgress(i, String.Format("当前值是 {0},操作被用户申请中断", i)); return false; } //处理的过程中,通过这个函数,向主线程报告处理进度,最好是折算成百分比, //与外边的进度条的最大值必须要对应。这里,我没有折算,而是把界面线程的进度条最大值调整为与这里的总数一致。 bk.ReportProgress(i, String.Format("当前值是 {0} ", i)); } return true; } } }
最后的效果是:
滚动条的效果还蛮拉风的~