C#中BackgroundWorker的介绍
BackgroundWorker可以解决执行耗时操作界面无法响应的问题,另外也提供异步操作取消以及下载进度报告等;它常用的属性有:
(1).CancellationPending属性,用来指示应用程序是否已请求取消后台操作;
(2).IsBusy属性,指示异步操作是否正在运行;
(3).WorkReportsProgress属性,指示Backgroundworker能否报告进度;
(4).WorkerSupportsCancellation属性,指示Backgroundworker是否支持异步取消操作。
常用方法有:
(1).public void CancelAsync():请求取消挂起的后台操作;
(2).public void RunWorkerAsync():开始执行后台操作(不带参数);
(3).public void RunWorkerAsync(object argument):开始执行后台操作(带参数);
(4).public void ReportProgress(int percentProgress):用于引发ProgressChanged事件。
下面是完整示例:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace BackGroundWorker { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { BackgroundWorker worker = null; public MainWindow() { InitializeComponent(); worker = new BackgroundWorker(); } private void MyDoWork(object sender, DoWorkEventArgs e) { for(int i = 0; i <= 100; i++) { worker.ReportProgress(i); Thread.Sleep(2000); //如果检测到点击了取消按钮,则退出当前循环 if (true == worker.CancellationPending) { e.Cancel = true; break; } } } private void MyDoWork1(object sender, DoWorkEventArgs e) { int number = 0; if(e != null) { number = (int)e.Argument; } for (int i = 0; i <= 100; i++) { worker.ReportProgress(i); Thread.Sleep(2000); //如果检测到点击了取消按钮,则退出当前循环 if(true == worker.CancellationPending) { e.Cancel = true; break; } } } //当后台操作已完成、被取消或引发异常时发生 private void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { btn_start.IsEnabled = false; btn_start1.IsEnabled = false; btn_cancel.IsEnabled = false; } private void Backchanged(object sender, ProgressChangedEventArgs e) { this.proBar.Value = e.ProgressPercentage; } private void btn_start_Click(object sender, RoutedEventArgs e) { //如果支持取消,则为true;否则为false。 默认值为false。 worker.WorkerSupportsCancellation = true; //支持进度更新,则为 true;否则为 false。 worker.WorkerReportsProgress = true; //调用 RunWorkerAsync()时发生 worker.DoWork += new DoWorkEventHandler(MyDoWork); //调用 ReportProgress(System.Int32)时发生 worker.ProgressChanged += new ProgressChangedEventHandler(Backchanged); //当后台操作已完成、被取消或引发异常时发生 worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RunWorkerCompleted); if(!worker.IsBusy) { //开始执行后台操作 worker.RunWorkerAsync(); } } private void btn_start1_Click(object sender, RoutedEventArgs e) { //如果支持取消,则为true;否则为false。 默认值为false。 worker.WorkerSupportsCancellation = true; //支持进度更新,则为 true;否则为 false。 worker.WorkerReportsProgress = true; //调用 RunWorkerAsync()时发生 worker.DoWork += new DoWorkEventHandler(MyDoWork1); //调用 ReportProgress(System.Int32)时发生 worker.ProgressChanged += new ProgressChangedEventHandler(Backchanged); if(!worker.IsBusy) { //开始执行后台操作 worker.RunWorkerAsync(100); } } private void btn_cancel_Click(object sender, RoutedEventArgs e) { if (worker.IsBusy && worker.WorkerSupportsCancellation) { //请求取消挂起的后台操作 worker.CancelAsync(); } } } }
演示效果如下: