1. 程式人生 > 其它 >winform BackgroundWorker元件操作

winform BackgroundWorker元件操作

  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 }