BackgroundWorker控件实现多线程操作
1 //有四个控件:bw:BackgroundWorker
2
3 //btnStart:Button
4
5 //btnEnd:Button
6
7 //progressBar1:ProgressBar
8
9 //拖BackgroundWorker控件时记得把WorkerReportsProgress和WorkerSupportsCancellation的属性设为 true;
10 /*
11 * BackgroundWorker类是.net 2.0里新增加的一个类,对于需要长时间操作而不需要用户长时间等待的情况可以使用这个类。
12 * 注意确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。
13 * 它有几个属性:
14 * CancellationPending——指示应用程序是否已请求取消后台操作。
15 * IsBusy——指示 BackgroundWorker 是否正在运行异步操作
16 * WorkerReportsProgress——该值指示 BackgroundWorker 能否报告进度更新
17 * WorkerSupportsCancellation——该值指示 BackgroundWorker 是否支持异步取消
18 * 还有如下事件:
19 * DoWork——调用 RunWorkerAsync 时发生。
20 * ProgressChanged——调用 ReportProgress 时发生。
21 * RunWorkerCompleted——当后台操作已完成、被取消或引发异常时发生。
22 *
23 * 还有如下方法:
24 * CancelAsync——请求取消挂起的后台操作
25 * ReportProgress——引发 ProgressChanged 事件
26 * RunWorkerAsync——开始执行后台操作
27 *
28 **/
29
30
31
32 using System;
33 using System.Collections.Generic;
34 using System.ComponentModel;
35 using System.Data;
36 using System.Drawing;
37 using System.Linq;
38 using System.Text;
39 using System.Windows.Forms;
40
41 namespace BackgroundWorkerDemo
42 {
43 public partial class MainForm : Form
44 {
45 #region ■手动new一个BackgroundWorker时的做法_______________
46
47 //private BackgroundWorker worker = new BackgroundWorker();
48
49 #endregion
50 public MainForm()
51 {
52 InitializeComponent();
53 #region ■手动new一个BackgroundWorker时的做法__________________________
54
55 //worker.WorkerReportsProgress = true;
56 //worker.WorkerSupportsCancellation = true;
57 ////正式做事情的地方
58 //worker.DoWork += new DoWorkEventHandler(DoWork);
59 ////任务完称时要做的,比如提示等等
60 //worker.ProgressChanged += new ProgressChangedEventHandler(ProgessChanged);
61 ////任务进行时,报告进度
62 //worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompleteWork);
63
64 #endregion
65 }
66
67
68 private void btnStart_Click(object sender, EventArgs e)
69 {
70 bw.RunWorkerAsync();
71 btnStart.Enabled = false;
72 btnPause.Enabled = true;
73 }
74
75 private void btnPause_Click(object sender, EventArgs e)
76 {
77 btnPause.Enabled = false;
78 btnStart.Enabled = true;
79 bw.CancelAsync();
80 }
81
82 //调用 RunWorkerAsync 时发生
83 private void bw_DoWork(object sender, DoWorkEventArgs e)
84 {
85 ComputeFibonacci(bw, e);//当ComputeFibonacci(worker, e)返回时,异步过程结束
86 }
87
88 //调用 ReportProgress 时发生
89 private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
90 {
91 this.progressBar1.Value = e.ProgressPercentage;
92 }
93
94 //当后台操作已完成、被取消或引发异常时发生
95 private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
96 {
97 MessageBox.Show("完成!");
98 }
99
100 private int ComputeFibonacci(object sender, DoWorkEventArgs e)
101 {
102 for (int i = 0; i < 1000; i++)
103 {
104 if (bw.CancellationPending)
105 {
106 e.Cancel = true; return -1;
107 }
108 else
109 {
110 int percent = 100 * i / 1000;//计算已完成的百分比
111 bw.ReportProgress(percent);
112 }
113 System.Threading.Thread.Sleep(10);
114 }
115 return -1;
116 }
117
118 #region ■手动new一个BackgroundWorker时的做法_________________________
119
120 ////调用 RunWorkerAsync 时发生
121 //public void DoWork(object sender, DoWorkEventArgs e)
122 //{
123 // e.Result = ComputeFibonacci(worker, e);//当ComputeFibonacci(worker, e)返回时,异步过程结束
124 //}
125 ////调用 ReportProgress 时发生
126 //public void ProgessChanged(object sender, ProgressChangedEventArgs e)
127 //{
128 // this.progressBar1.Value = e.ProgressPercentage;
129 //}
130 ////当后台操作已完成、被取消或引发异常时发生
131 //public void CompleteWork(object sender, RunWorkerCompletedEventArgs e)
132 //{
133 // MessageBox.Show("完成!");
134 //}
135
136 #endregion
137
138 }
139
140 }
posted on 2011-04-12 13:11 Osiris4Net 阅读(226) 评论(0) 编辑 收藏 举报