winform BackgroundWorker元件操作
阿新 • • 發佈:2021-07-21
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.Threading;
9 using System.Windows.Forms;
10
11 namespace BackgroundWorkTest
12 {
13 public partial class Form1 : Form
14 {
15 public Form1()
16 {
17 InitializeComponent();
18 }
19
20 /// <summary>
21 /// 開始執行按鈕
22 /// </summary>
23 /// <param name="sender"></param>
24 /// <param name="e"></param>
25 private void btnStart_Click(object sender, EventArgs e)
26 {
27 if (backgroundWorker1.IsBusy)
28 {
29 MessageBox.Show("正在執行執行緒");
30 return;
31 }
32
33 backgroundWorker1.RunWorkerAsync(1000);
34 }
35
36 /// <summary>
37 /// 後臺元件工作中執行的程式碼
38 /// </summary>
39 /// <param name="sender"></param>
40 /// <param name="e">e.Argument傳遞的數值</param>
41 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
42 {
43 int n = 0;
44 int sum = 0;
45 //獲取非同步操作的數值
46 if (e.Argument != null)
47 {
48 n = (int)e.Argument;
49 }
50
51 for (int i = 0; i < n; i++)
52 {
53 //是否取消後臺操作
54 if (backgroundWorker1.CancellationPending)
55 {
56 e.Cancel = true;
57 return;
58 }
59 sum += i;
60 Thread.Sleep(10);
61 //通過計算,傳遞值為100.比如i=1000,i / 10 = 100;
62 backgroundWorker1.ReportProgress(i / 10, "當前i的值為" + Convert.ToString(i));
63 }
64 //非同步操作結果的值
65 e.Result = sum;
66 }
67
68 private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
69 {
70 //注意value數值不能大於100
71 progressBar1.Value = e.ProgressPercentage;
72 label1.Text = e.UserState.ToString();
73 }
74
75 private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
76 {
77 //非同步操作期間是否出錯
78 if (!(e.Error == null))
79 {
80 MessageBox.Show(e.Error.Message);
81 return;
82 }
83
84 //非同步操作期間是否取消
85 if (e.Cancelled)
86 {
87 progressBar1.Value = 0;
88 label1.Text = "";
89 MessageBox.Show("取消執行緒的執行");
90 return;
91 }
92
93 label1.Text = "計算結果:" + e.Result.ToString();
94 // this.progressBar1.Value = 100;
95 }
96
97 /// <summary>
98 /// 取消按鈕
99 /// </summary>
100 /// <param name="sender"></param>
101 /// <param name="e"></param>
102 private void btnCancel_Click(object sender, EventArgs e)
103 {
104 if (!backgroundWorker1.IsBusy) return;
105
106 //取消後臺操作
107 backgroundWorker1.CancelAsync();
108
109 }
110 }
111 }