查詢了一下MSDN文檔,其中微軟就BackgroundWorker類的功能有這麼一個描述(英文的,根據我的理解翻譯):BackgroundWorker類容許您在單獨的線程上執行某個可能致使用戶界面(UI)中止響應的耗時操做(好比文件下載數據庫事務等),而且想要一個響應式的UI來反應當前耗時操做的進度。
能夠看的出來,BackgroundWorker組件提供了一種執行異步操做(後臺線程)的同時,而且還能妥妥的顯示操做進度的解決方案。因而乎,我便深刻的瞭解了一下BackgroundWorker類。針對BackgroundWorker類的部分重要屬性和方法進行了一次總結。 數據庫
private BackgroundWorker bgWorker = new BackgroundWorker(); bgWorker.WorkerReportsProgress = true;
bgWorker.WorkerSupportsCancellation = true;
//在DoWork中鍵入以下代碼 for (int i = 0; i <= 100; i++) { if (bgWorker.CancellationPending) { e.Cancel = true; return; } else { bgWorker.ReportProgress(i,"Working"); System.Threading.Thread.Sleep(10); } }
//防止重複執行異步操做引起錯誤 if (bgWorker.IsBusy) return; bgWorker.RunWorkerAsync();
//在啓動異步操做的地方鍵入代碼 bgWorker.RunWorkerAsync("hello");
for (int i = 0; i <= 100; i++) { //向ProgressChanged報告進度 bgWorker.ReportProgress(i,"Working"); System.Threading.Thread.Sleep(10); }
//在須要執行取消操做的地方鍵入如下代碼 bgWorker.CancelAsync();
DoWork
用於承載異步操做。當調用BackgroundWorker.RunWorkerAsync()時觸發。
須要注意的是,因爲DoWork事件內部的代碼運行在非UI線程之上,因此在DoWork事件內部應避免於用戶界面交互,而於用戶界面交互的操做應放置在ProgressChanged和RunWorkerCompleted事件中。異步
ProgressChanged
當調用BackgroundWorker.ReportProgress(int percentProgress)方式時觸發該事件。
該事件的ProgressChangedEventArgs.ProgressPercentage屬性能夠接收來自ReportProgress方法傳遞的percentProgress參數值,ProgressChangedEventArgs.UserState屬性能夠接收來自ReportProgress方法傳遞的userState參數。this
RunWorkerCompleted
異步操做完成或取消時執行的操做,當調用DoWork事件執行完成時觸發。
該事件的RunWorkerCompletedEventArgs參數包含三個經常使用的屬性Error,Cancelled,Result。其中,Error表示在執行異步操做期間發生的錯誤;Cancelled用於判斷用戶是否取消了異步操做;Result屬性接收來自DoWork事件的DoWorkEventArgs參數的Result屬性值,可用於傳遞異步操做的執行結果。spa
前臺線程
後臺翻譯
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace PrograssBar { public partial class PrograssBarUseBackgroundWorker : Form { private BackgroundWorker bgWorker = new BackgroundWorker(); public PrograssBarUseBackgroundWorker() { InitializeComponent(); InitializeBackgroundWorker(); } private void InitializeBackgroundWorker() { bgWorker.WorkerReportsProgress = true; bgWorker.WorkerSupportsCancellation = true; bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork); bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgessChanged); bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_WorkerCompleted); } private void btnStart_Click(object sender, EventArgs e) { if (bgWorker.IsBusy) return; this.progressBar1.Maximum = 100; this.btnStart.Enabled = false; this.btnStop.Enabled = true; bgWorker.RunWorkerAsync("hello"); } public void bgWorker_DoWork(object sender, DoWorkEventArgs e) { for (int i = 0; i <= 100; i++) { if (bgWorker.CancellationPending) { e.Cancel = true; return; } else { bgWorker.ReportProgress(i,"Working"); System.Threading.Thread.Sleep(10); } } } public void bgWorker_ProgessChanged(object sender, ProgressChangedEventArgs e) { //string state = (string)e.UserState;//接收ReportProgress方法傳遞過來的userState this.progressBar1.Value = e.ProgressPercentage; this.label1.Text = "處理進度:" + Convert.ToString(e.ProgressPercentage) + "%"; } public void bgWorker_WorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if(e.Error!=null) { MessageBox.Show(e.Error.ToString()); return; } if (!e.Cancelled) this.label1.Text = "處理完畢!"; else this.label1.Text = "處理終止!"; } private void btnStop_Click(object sender, EventArgs e) { this.btnStart.Enabled = true; this.btnStop.Enabled = false; bgWorker.CancelAsync(); } } }
運行結果:code