微软的官方例子

BackgroudWorker就是一个封装好的异步处理类(就是多线程,广泛用于winform开发中)

例子:

1.界面效果:

    一个label,两个button

  BackgroundWorker的简单用法

2.Form2.cs的代码

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Windows.Forms;
  9 
 10 namespace BackgroundWorkerTest
 11 {
 12     public partial class Form2 : Form
 13     {
 14         /*
 15          * 使用BackgroundWorker的用法很多
 16          * 1.可以直接从左边控件列表中拖一个到界面中
 17          * 2.动态写代码生成,这里我是把它作为成员变量了
 18          * **/
 19         private BackgroundWorker _worker = new BackgroundWorker();
 20 
 21         public Form2()
 22         {
 23             InitializeComponent();
 24 
 25             //设置是否允许报告进度
 26             _worker.WorkerReportsProgress = true;
 27             //设置是否允许取消
 28             _worker.WorkerSupportsCancellation = true;
 29 
 30 
 31             //BackgroundWorker的三个事件之一,异步处理是所要执行的动作
 32             _worker.DoWork += new DoWorkEventHandler(_worker_DoWork);
 33 
 34             //BackgroundWorker的三个事件之二,当进度改变时所要执行的动作
 35             _worker.ProgressChanged += new ProgressChangedEventHandler(_worker_ProgressChanged);
 36 
 37             //BackgroundWorker的三个事件之三,当任务正常完成或手动取消时,所要执行的动作
 38             _worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_worker_RunWorkerCompleted);
 39         }
 40 
 41 
 42         //运行RunWorkerAsync()时就出发此方法,而且此方法不能与UI有交互,会抛异常
 43         void _worker_DoWork(object sender, DoWorkEventArgs e)
 44         {
 45             //这个类是用来测试报告进度时,除了可以报告进度外,还可以返回一个object的变量
 46             Person tommy = new Person("Tommy.Huang","25","CXY");
 47 
 48             for (int i = 1; i <= 100; i++)
 49             {
 50                 //如果想要实现能够中途取消的功能,就必须在DoWork里面判断是否点击了取消
 51                 //CancellationPending用于判断是运行了CancelAsync()方法
 52                 if (_worker.CancellationPending)
 53                 {
 54                     e.Cancel = true;
 55                     break;
 56                 }
 57                 else
 58                 {
 59                     _worker.ReportProgress(i,tommy);//ReportProgress可以带1个或2个参数,第一个为进度int,第二个为object
 60                     //因为太快,看不到效果,所以让线程每一次暂停半秒
 61                     System.Threading.Thread.Sleep(100);
 62                 }
 63             }
 64         }
 65 
 66         //当进度有所改变时,就会触发该方法,此方法可以与UI交互,所以通常在此方法中处理
 67         void _worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
 68         {
 69             Person p = e.UserState as Person;
 70             this.label1.Text = e.ProgressPercentage.ToString()+"% -"+p.Name;
 71         }
 72 
 73         //当异步线程正常运行结束,或者点击取消时都会执行此方法
 74         void _worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
 75         {
 76             if (e.Cancelled)
 77                 System.Windows.Forms.MessageBox.Show("取消了");
 78             else
 79                 System.Windows.Forms.MessageBox.Show("完成了!");
 80         }
 81 
 82         private void btnStart_Click(object sender, EventArgs e)
 83         {
 84             //需要先判断backgroundWorker是否正在运行
 85             if (!_worker.IsBusy)
 86             {
 87                 //RunWorkerAsync()启动线程
 88                 _worker.RunWorkerAsync();
 89             }
 90         }
 91 
 92         private void btnCancel_Click(object sender, EventArgs e)
 93         {
 94             //先判断backgroundWorker是否支持取消
 95             if (_worker.WorkerSupportsCancellation)
 96             {
 97                 //CancelAsync()取消线程
 98                 _worker.CancelAsync();
 99             }
100         }
101 
102     }
103 }
View Code

相关文章: