GUI编程中,经常需要另建一个线程,在后台运行以完成某项工作,并不时地与界面主线程进行通信,以改变界面显示。BackgroundWorker类为此而生。
BackgroundWorker类的主要成员:
属性:
WorkerReportsProgress :用于设置后台任务是否可以把它的进度汇报给主线程
WorkerSupportsCancellation :是否支持从主线程取消
IsBusy:检查后台任务是否正在运行
事件:
DoWork : 在后台线程开始的时候触发该事件
ProgressChanged : 在后台任务需要汇报状时候触发该事件,主要用于中途让主界面更新显示。
RunWorkerCompleted : 在后台工作线程退出的时候触发该事件
方法:
RunWorkerAsync(): 主线程调用该方法开启后台线程并执行DoWork事件处理程序
CancelAsync(): 调用CancelAsync方法把CancellationPending属性设为true。DoWork事件处理程序需要检查这个属性来决定是否应该停止处理
ReportProgress(): 主动向主线程汇报,此时触发事件响应程序ProcessChanged_Handler(),参数可重载,用于传出参数
下面是一个进度条的示例,点击【处理】开始进度条,中途点击【取消】马上可以中止进度条。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace theAsync { public partial class FormMain : Form { BackgroundWorker bgWorker = new BackgroundWorker();
public FormMain() { InitializeComponent(); //设置BackgroundWorker属性 bgWorker.WorkerReportsProgress = true;//可以向主线程汇报进度 bgWorker.WorkerSupportsCancellation = true;//可以从主线程取消工作线程 //连接BackgroundWorker对象的处理程序 bgWorker.DoWork += DoWork_Handler;//在后台线程开始的时候触发Dowork事件 bgWorker.ProgressChanged += ProcessChanged_Handler;//在后台任务汇报状态的时候触发ProgressChanged事件,用于后台处理过程中和主线程的通信 bgWorker.RunWorkerCompleted += RunWorkerCompleted_Handler;//后台工作线程退出的时候触发RunWorkerCompleted事件 } private void btnProcess_Click(object sender, EventArgs e) { if (!bgWorker.IsBusy) bgWorker.RunWorkerAsync();//启动后台线程并且执行DoWork事件处理程序DoWork_Handler() } private void ProcessChanged_Handler(object sender, ProgressChangedEventArgs args) { progressBar.Value = args.ProgressPercentage; } private void DoWork_Handler(object sender, DoWorkEventArgs args) { BackgroundWorker worker = sender as BackgroundWorker; for (int i = 1; i <= 100; i++ ) { if (worker.CancellationPending)//检查任务是否被取消,若取消,此处主动处理 { args.Cancel = true; break; } else { worker.ReportProgress(i);//主动向主线程汇报,此时触发事件响应程序ProcessChanged_Handler(),参数重载为DoWorkEventArgs Thread.Sleep(100); } } } private void RunWorkerCompleted_Handler(object sender, RunWorkerCompletedEventArgs args) { progressBar.Value = 0; if (args.Cancelled) MessageBox.Show("处理取消"); else MessageBox.Show("处理完成"); } private void btnCancelled_Click(object sender, EventArgs e) { bgWorker.CancelAsync();//调用CancelAsync方法把CancellationPending属性设为true。DoWork事件处理程序需要检查这个属性来决定是否应该停止处理 } } }