今天要做一个批量处理图层数据的功能,希望在处理任务过程中,各个任务都能在进度条中显示自己的当前进度,决定继续使用强大易用的BackgroundWorker组件。通过在RunWorkerCompleted事件中进行控制来达到各任务独立显示完成进度的目标。测试在之前的介绍BackgroundWork功能的测试代码基础上展开,测试例子截图如下:
分别向每个ListBox中写入1-100000的数字,向每个Listbox中写入过程中,进度条都自左向右走一遍,直到3个ListBox写入数字任务全部完成。代码如下:

1 public partial class Form1 : Form 2 { 3 List<ListBox> m_NumberBoxList = new List<ListBox>();//存放ListBox 4 ListBox m_CurrentListBox = null;//当前写入Items的ListBox 5 int m_CurrentListBoxIndex = 0;//当前写入Items的ListBox的索引 6 public Form1() 7 { 8 InitializeComponent(); 9 10 backgroundWorker1.WorkerReportsProgress = true;//报告完成进度 11 backgroundWorker1.WorkerSupportsCancellation = true;//允许用户终止后台线程 12 backgroundWorker1.DoWork += new DoWorkEventHandler(ListNumber); 13 14 m_NumberBoxList.Add(listBox1); 15 m_NumberBoxList.Add(listBox2); 16 m_NumberBoxList.Add(listBox3); 17 } 18 19 private void btnOk_Click(object sender, EventArgs e) 20 { 21 //向第一个ListBox写入数值 22 m_CurrentListBox = m_NumberBoxList[0]; 23 if (!backgroundWorker1.IsBusy)//判断backgroundWorker1是否正在运行异步操作 24 { 25 backgroundWorker1.RunWorkerAsync(100000);//开始执行后台操作 26 } 27 } 28 29 void ListNumber(object sender, DoWorkEventArgs e) 30 { 31 int num = (int)e.Argument;//接收传入的参数 32 for (int i = 1; i <= num; i++) 33 { 34 if (backgroundWorker1.CancellationPending)//判断是否请求了取消后台操作 35 { 36 e.Cancel = true; 37 return ; 38 } 39 backgroundWorker1.ReportProgress(i * 100 / num, i);//报告完成进度 40 System.Threading.Thread.Sleep(0);//后台线程交出时间片 41 } 42 } 43 44 private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 45 { 46 progressBar1.Value = e.ProgressPercentage;//将完成进度数据传给进度条 47 m_CurrentListBox.Items.Add(e.UserState);//将中间计算结果在ListBox控件中显示出来 48 m_CurrentListBox.Update();//刷新ListBox 49 } 50 51 private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 52 { 53 progressBar1.Value = 0; 54 m_CurrentListBoxIndex++; 55 56 if(m_CurrentListBoxIndex!=m_NumberBoxList.Count) 57 { 58 m_CurrentListBox = m_NumberBoxList[m_CurrentListBoxIndex]; 59 if (!backgroundWorker1.IsBusy)//判断backgroundWorker1是否正在运行异步操作 60 { 61 backgroundWorker1.RunWorkerAsync(100000);//开始执行后台操作 62 } 63 } 64 else 65 { 66 m_CurrentListBoxIndex = 0; 67 MessageBox.Show("处理完成!"); 68 } 69 } 70 71 private void btnStop_Click(object sender, EventArgs e) 72 { 73 if (backgroundWorker1.WorkerSupportsCancellation == true) 74 { 75 backgroundWorker1.CancelAsync();//取消后台操作 76 backgroundWorker1.Dispose();//释放资源 77 } 78 } 79 }
运行过程截图如下: