博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

BackgroundWorker学习

Posted on 2016-11-08 16:24  system_kk  阅读(118)  评论(0编辑  收藏  举报

后台代码:

  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 winform
 11 {
 12     public partial class fm : Form
 13     {
 14         BackgroundWorker worker;
 15         public fm()
 16         {
 17             InitializeComponent();
 18             worker = new BackgroundWorker();
 19             worker.WorkerReportsProgress = true;
 20             worker.WorkerSupportsCancellation = true;
 21             //正式做事情的地方
 22             worker.DoWork += new DoWorkEventHandler(DoWork);
 23             //任务完称时要做的,比如提示等等
 24             worker.ProgressChanged += new ProgressChangedEventHandler(ProgessChanged);
 25             //任务进行时,报告进度
 26             worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RunWorkerCompleted);
 27             progressBar1.Maximum = 100;
 28         }
 29         //调用 RunWorkerAsync 时发生
 30         public void DoWork(object sender, DoWorkEventArgs e)
 31         {
 32             e.Result = ComputeFibonacci(worker, e);
 33 
 34             //获取异步操作结果的值,当ComputeFibonacci(worker, e)返回时,异步过程结束
 35         }
 36 
 37         //调用 ReportProgress 时发生
 38         public void ProgessChanged(object sender, ProgressChangedEventArgs e)
 39         {
 40             this.progressBar1.Value = e.ProgressPercentage;
 41             //将异步任务进度的百分比赋给进度条
 42             int value = int.Parse(e.UserState.ToString());
 43             if (value % 10 == 0)
 44                 textBox1.Text += "\r\n" + value;
 45             else
 46                 textBox1.Text += "-" + value;
 47             label1.Text = string.Format("完成{0}%", (value + 1) * 100 / progressBar1.Maximum);
 48         }
 49 
 50         //当后台操作已完成、被取消或引发异常时发生
 51         public void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
 52         {
 53             if (e.Cancelled)
 54                 MessageBox.Show("取消了");
 55             else
 56                 MessageBox.Show("完成!" + e.Result);
 57         }
 58 
 59         private int ComputeFibonacci(object sender, DoWorkEventArgs e)
 60         {
 61 
 62             for (int i = 0; i < 100; i++)
 63             {
 64                 //判断应用程序是否取消后台操作
 65                 if (worker.CancellationPending)
 66                 {
 67                     e.Cancel = true;
 68                     break;
 69                 }
 70                 //dowork function
 71                 worker.ReportProgress(i, i);
 72                 System.Threading.Thread.Sleep(50);
 73             }
 74             return -1;
 75         }
 76         private void btnStart_Click(object sender, EventArgs e)
 77         {
 78             if (worker.IsBusy)
 79             {
 80                 MessageBox.Show("已经执行异步操作");
 81                 return;
 82             }
 83             textBox1.Text = "";
 84             label1.Text = "";
 85             worker.RunWorkerAsync();
 86 
 87             btnStart.Enabled = false;
 88 
 89             btnPause.Enabled = true;
 90         }
 91 
 92         private void btnPause_Click(object sender, EventArgs e)
 93         {
 94             btnPause.Enabled = false;
 95 
 96             btnStart.Enabled = true;
 97 
 98             worker.CancelAsync();
 99         }
100     }
101 }
View Code

页面效果: