網上的例子少了好多屬性的配置,改好了一個能直接用的:
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 XXXX 11 { 12 public partial class BackGroundWorker : Form 13 { 14 public BackGroundWorker() 15 { 16 InitializeComponent(); 17 backgroundWorker1.WorkerReportsProgress = true; 18 backgroundWorker1.WorkerSupportsCancellation = true; 19 backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); 20 backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); 21 backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork); 22 progressBar1.Maximum = 10000; 23 } 24 25 //這里就是通過響應消息,來處理界面的顯示工作 26 private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 27 { 28 this.progressBar1.Value = e.ProgressPercentage; 29 this.label1.Text = e.UserState.ToString(); 30 this.label1.Update(); 31 } 32 33 //這里是后台工作完成后的消息處理,可以在這里進行后續的處理工作。 34 private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 35 { 36 MessageBox.Show("運算終於完成了"); 37 } 38 39 //這里,就是后台進程開始工作時,調用工作函數的地方。你可以把你現有的處理函數寫在這兒。 40 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 41 { 42 work(this.backgroundWorker1); 43 } 44 45 //真正的處理工作 46 private bool work(BackgroundWorker bk) 47 { 48 int tatle = 10001; 49 50 for (int i = 0; i < tatle; i++) 51 { 52 if (bk.CancellationPending) //這里判斷一下是否用戶要求取消后台進行,並可以盡早退出。 53 { 54 bk.ReportProgress(i, String.Format("當前值是 {0},操作被用戶申請中斷", i)); 55 return false; 56 } 57 58 //處理的過程中,通過這個函數,向主線程報告處理進度,最好是折算成百分比,與外邊的進度條的最大值必須要對應。這里,我沒有折算,而是把界面線程的進度條最大值調整為與這里的總數一致。 59 bk.ReportProgress(i, String.Format("當前值是 {0} ", i)); 60 } 61 return true; 62 } 63 64 private void button2_Click(object sender, EventArgs e) 65 { 66 //用戶要求取消時,就這樣處理一下。有時不太靈喔。 67 this.backgroundWorker1.CancelAsync(); 68 } 69 70 private void button1_Click(object sender, EventArgs e) 71 { 72 if (this.backgroundWorker1.IsBusy) 73 return; 74 this.backgroundWorker1.RunWorkerAsync(); 75 } 76 77 private void button3_Click(object sender, EventArgs e) 78 { 79 this.Close(); 80 } 81 } 82 }
窗體擺幾個控件就可以了

