C# BackgroundWorker組件學習html
一個程序中須要進行大量的運算,而且須要在運算過程當中支持用戶必定的交互,爲了得到更好的用戶體驗,使用BackgroundWorker來完成這一功能. 數據庫
BackgroundWorker類容許您在單獨的專用線程上運行操做。 耗時的操做(以下載和數據庫事務)在長時間運行時可能會致使用戶界面 (UI) 彷佛處於中止響應狀態。編程
若是您須要能進行響應的用戶界面,並且面臨與這類操做相關的長時間延遲,則可使用 BackgroundWorker類方便地解決問題(MSDN)。 app
若要在後臺執行耗時的操做,請建立一個 BackgroundWorker,偵聽那些報告操做進度並在操做完成時發出信號的事件。 能夠經過編程方式建立 BackgroundWorker,異步
也能夠將它從「工具箱」的「組件」選項卡中拖到窗體上。 若是在 Windows 窗體設計器中建立 BackgroundWorker,則它會出如今組件欄中,並且它的屬性會顯示在「屬性」窗async
口中(MSDN)。ide
屬性:工具
IsBusy:獲取一個值,指示 BackgroundWorker 是否正在運行異步操做。學習
WorkerReportsProgress: 獲取或設置一個值,該值指示 BackgroundWorker 可否報告進度更新。ui
WorkerSupportsCancellation: 獲取或設置一個值,該值指示 BackgroundWorker 是否支持異步取消。
事件:
DoWork: 調用 RunWorkerAsync 時發生。
ProgressChanged: 調用 ReportProgress 時發生。
RunWorkerCompleted: 當後臺操做已完成、被取消或引起異常時發生。
實例:
窗體設計以下圖:
代碼實現:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); backgroundWorker1.WorkerReportsProgress = true; backgroundWorker1.WorkerSupportsCancellation = true; } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; for (int i = 1; i <= 12; i++) { if (worker.CancellationPending == true) { e.Cancel = true; break; } else { System.Threading.Thread.Sleep(500); worker.ReportProgress(i * 10); } } } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { lbResult.Text = (e.ProgressPercentage.ToString() + "%"+e.UserState); } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled == true) { lbResult.Text = "Canceled!"; } else if (e.Error != null) { lbResult.Text = "Error: " + e.Error.Message; } else { lbResult.Text = "Done!"; } } private void btnStartAsync_Click(object sender, EventArgs e) { if (backgroundWorker1.IsBusy != true) { backgroundWorker1.RunWorkerAsync(); } } private void btnCancelAsync_Click(object sender, EventArgs e) { if (backgroundWorker1.WorkerSupportsCancellation == true) { backgroundWorker1.CancelAsync(); } } } }
運行結果: