简单使用BackgroundWorker创建多个线程的教程

2019-05-20 11:58:50王振洲


     bw.RunWorkerAsync();
 }

 private void button2_Click(object sender, EventArgs e)
 {
     bw.CancelAsync();
 }

 void bw_DoWork(object sender, DoWorkEventArgs e)
 {
     for (int i = 0; i < 1000; i++)
     {
         if (bw.CancellationPending)
         {
             e.Cancel = true;
             return;
         }

         this.Invoke((MethodInvoker)delegate
         {
             this.richTextBox1.Text += i + Environment.NewLine;
         });
     }
 }

 void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
 {
     if (e.Cancelled)
     {
         this.richTextBox1.Text += "线程已经停止";
     }
     else
     {
         this.richTextBox1.Text += "线程已经完成";
     }
 }

到现在为止你可以自己去用BackgroundWorker创建一个线程了,你已经了解它了,当然BackgroundWorker还有一个ReportProgress滚动条事件,可以显示进度,我暂且认为它是多余的,因为大部分进度都可以通过bw_DoWork来控制实现。下面我们继续完善BackgroundWorker,加入暂停和继续功能。

再拖动一个button控件到界面,BackgroundWorker的暂停和继续我们使用ManualResetEvent。


BackgroundWorker bw = null;
 //创建ManualResetEvent
 ManualResetEvent mr = new ManualResetEvent(true); 

 private void button1_Click(object sender, EventArgs e)
 {
     bw = new BackgroundWorker();
     bw.WorkerSupportsCancellation = true;
     bw.DoWork += new DoWorkEventHandler(bw_DoWork);
     bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);

     bw.RunWorkerAsync();
 }

 private void button2_Click(object sender, EventArgs e)
 {
     bw.CancelAsync();
 }

 private void button3_Click(object sender, EventArgs e)
 {
     Button b = (Button)sender;
     if (b.Text == "暂停")  
     {  
         mr.Reset();