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

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

     textbox.ScrollToCaret();
 }

上面是BackgroundWorker一个最简单的例子,没有多余复杂的代码,这就是BackgroundWorker,下面我们加入停止按钮,让线程停下来。

再拖动一个button控件到界面,让线程停止我们先要改造一下代码,让button事件也能控制到BackgroundWorker线程。


BackgroundWorker bw = null;

 private void button1_Click(object sender, EventArgs e)
 {
     //创建一个BackgroundWorker线程
     bw = new BackgroundWorker();
     //指定可以让线程停止
     bw.WorkerSupportsCancellation = true;
     //创建一个DoWork事件,指定bw_DoWork方法去做事
     bw.DoWork += new DoWorkEventHandler(bw_DoWork);
     //开始执行
     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;
         });
     }
 }

为了避免代码的复杂化,上面代码我没有做更多的体验修改,比如点击开始的按钮,开始的按钮应该为不可用状态,点击停止按钮后停止按钮不可用状态,激活开始按钮。

下面我们将继续升级,如何来获知线程是否已经执行完成或者线程已经停止了呢


BackgroundWorker bw = null;

 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);