1.backgroundworker简介

当用户执行一个非常耗时的操作时,如果不借助Thread编程,用户就会感觉界面反映很迟钝。在.Net 2.0中可以通过BackgroundWork非常方便地进行Thread编程,大致的步骤是:
1、调用BackgroundWorker的RunWorkerAsync方法(可以传递参数),它将调用DoWork事件
2、在DoWork的事件响应代码中调用耗时的操作,此例中是PingIPs函数
3、在耗时操作中判断CancellationPending属性,如果为false则退出
4、如果要向用户界面发送信息,则调用BackgroundWorker的ReportProgress方法,它将调用ProgressChanged事件(可以将改变通过object类型传递)
5、在ProgressChanged事件的响应代码中将改变呈现给用户
6、如果需要取消耗时操作,则调用BackgroundWorker的CancelAsync方法,需要和步骤3一起使用

2.backgroundworker例子

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Threading;

namespace WindowsApplication15
{
   public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }

       private void button1_Click(object sender, EventArgs e)
       {
           //textBox1.Text里面储存URL
           backgroundWorker1.RunWorkerAsync(textBox1.Text);
       }

       private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
       {
            BackgroundWorker bw = (BackgroundWorker)sender;
            string url = e.Argument.ToString();

            for (int i = 0; i < 10; i++)
            {
                //没有取消后台操作
                if (!bw.CancellationPending)
                {
                    WebRequest req = WebRequest.Create(url);
                    WebResponse resp = req.GetResponse();
                    resp.Close();

                    Thread.Sleep(1000);
                    bw.ReportProgress(i * 100 / 10, i);
                }
            }
       }

       private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgse)
       {
           progressBar1.Value = e.ProgressPercentage;
           label1.Text = e.UserState.ToString();
       }

       private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
       {
           MessageBox.Show("ok!");
       }
   }
}

 

3.backgroundworker与thread的区别

a. BackgroundWorker在内部封装了线程.所以你创建了一个BackgroundWorker,就相当于创建一个线程,并且提供一个方法做为任务由它去执行. 而且从名字上看很明显,它是一个后台任务,一定要在单独的线程上运行的. 
b.在WINDWOS桌面程序中使用线程时,常常会遇到需要跨线程访问线程的情况,因为WINDOWS的界面控件都不是线程安全的,所以不能直接跨线程访问,虽然.NET提供了BeginInvoke,Invoke的封送方法,但代码仍然较乏味.所以在.NET中,微软提供了对线程封装的组件BackgroundWorker,用这个类时,你可以在它的工作方法中去访问另外线程的控件,不必考虑封送,这是因为它内部帮你封送了. 

c. 使用BackgroundWorker时,处理进度显示量容易. 

d. 当你执行的任务较简单,不需要复杂控制时使用BackgroundWorker,较为方便;当你要执行的任务需要复杂控制(如线程同步)时,要自己 创建线程.