BackgroundWorker是System.ComponentModel下面的一个管理工作线程的帮助类,提供了下面几个特性
- 支持取消。
- 可以安全的更新WPF或windows Forms 控件。
- 在completion event中可以查询异常信息。
- 可以报告进度。
- 因为实现了IComponent接口,所以可以被设计器使用。
- BackgroundWorker使用了线程池,这意味着你永远都不能在一个BackgroundWorker线程上调用Abort方法
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
ThreadBackgroundWorker.MainThread();
Console.ReadKey();
}
}
class ThreadBackgroundWorker
{
static BackgroundWorker _bw;
public static void MainThread()
{
_bw = new BackgroundWorker
{
WorkerReportsProgress = true, //允许报告进度
WorkerSupportsCancellation = true //允许取消
};
_bw.DoWork += new DoWorkEventHandler(_bw_DoWork);
_bw.ProgressChanged += new ProgressChangedEventHandler(_bw_ProgressChanged);
_bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_bw_RunWorkerCompleted);
_bw.RunWorkerAsync("Hello to worker");
Console.WriteLine("Press Enter in the next 5 seconds to cancel.");
Console.ReadLine();
if (_bw.IsBusy) _bw.CancelAsync();
Console.ReadLine();
}
static void _bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled) //是否取消
Console.WriteLine("You canceled!");
else if (e.Error != null) //是否有异常
Console.WriteLine("Worker exception:" + e.Error.ToString());
else
Console.WriteLine("Complete:" + e.Result);
}
static void _bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//输出进度报告
Console.WriteLine("Reached " + e.ProgressPercentage + "%");
}
static void _bw_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 100; i += 20)
{
if (_bw.CancellationPending) { e.Cancel = true; return; }
_bw.ReportProgress(i); //报告进度
Thread.Sleep(1000);
}
e.Result = 123;
}
}
}
{
class Program
{
static void Main(string[] args)
{
ThreadBackgroundWorker.MainThread();
Console.ReadKey();
}
}
class ThreadBackgroundWorker
{
static BackgroundWorker _bw;
public static void MainThread()
{
_bw = new BackgroundWorker
{
WorkerReportsProgress = true, //允许报告进度
WorkerSupportsCancellation = true //允许取消
};
_bw.DoWork += new DoWorkEventHandler(_bw_DoWork);
_bw.ProgressChanged += new ProgressChangedEventHandler(_bw_ProgressChanged);
_bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_bw_RunWorkerCompleted);
_bw.RunWorkerAsync("Hello to worker");
Console.WriteLine("Press Enter in the next 5 seconds to cancel.");
Console.ReadLine();
if (_bw.IsBusy) _bw.CancelAsync();
Console.ReadLine();
}
static void _bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled) //是否取消
Console.WriteLine("You canceled!");
else if (e.Error != null) //是否有异常
Console.WriteLine("Worker exception:" + e.Error.ToString());
else
Console.WriteLine("Complete:" + e.Result);
}
static void _bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//输出进度报告
Console.WriteLine("Reached " + e.ProgressPercentage + "%");
}
static void _bw_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 100; i += 20)
{
if (_bw.CancellationPending) { e.Cancel = true; return; }
_bw.ReportProgress(i); //报告进度
Thread.Sleep(1000);
}
e.Result = 123;
}
}
}
与progressbar结合的例子
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
/// <summary>
/// 后台线程
/// </summary>
private BackgroundWorker bkWorker = new BackgroundWorker();
/// <summary>
/// 步进值
/// </summary>
private int percentValue = 0;
public Form1()
{
InitializeComponent();
bkWorker.WorkerReportsProgress = true;
bkWorker.WorkerSupportsCancellation = true;
bkWorker.DoWork += new DoWorkEventHandler(DoWork);
bkWorker.ProgressChanged += new ProgressChangedEventHandler(ProgessChanged);
bkWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompleteWork);
}
private void btnStart_Click_1(object sender, EventArgs e)
{
percentValue = 10;
this.progressBar1.Maximum = 1000;//共有一千条数据需要处理所以 maximum为1000
// 执行后台操作
bkWorker.RunWorkerAsync();
}
public void DoWork(object sender, DoWorkEventArgs e)
{
// 事件处理,指定处理函数
e.Result = ProcessProgress(bkWorker, e);
}
public void ProgessChanged(object sender, ProgressChangedEventArgs e)
{
// bkWorker.ReportProgress 会调用到这里,此处可以进行自定义报告方式
this.progressBar1.Value = e.ProgressPercentage;
int percent = (int)(e.ProgressPercentage / percentValue);
this.label1.Text = "处理进度:" + Convert.ToString(percent) + "%";
}
public void CompleteWork(object sender, RunWorkerCompletedEventArgs e)
{
this.label1.Text = "处理完毕!";
}
private int ProcessProgress(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 1000; i++)
{
if (bkWorker.CancellationPending)
{
e.Cancel = true;
return -1;
}
else
{
// 状态报告
bkWorker.ReportProgress(i);
// 等待,用于UI刷新界面,很重要
System.Threading.Thread.Sleep(1);
}
}
return -1;
}
}
}