GUI异步编程之BackgroundWorker类

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事件处理程序需要检查这个属性来决定是否应该停止处理 } } }

posted on 2014-12-17 14:34  万里驰骋  阅读(218)  评论(0编辑  收藏  举报

导航