Keywords: C# .NET BackgroundWorker
Source: http://txw1958.cnblogs.com/
BackgroundWorker是.NET Framework 里用來執行多線程任務的控件,它允許開發人員在一個單獨的線程上執行一些操作。耗時的操作(如下載和數據庫事務)在長時間運行時可能會導致用戶界面 (UI) 始終處於停止響應狀態。如果您需要能進行響應的用戶界面,而且面臨與這類操作相關的長時間延遲,則可以使用 BackgroundWorker 類方便地解決問題。
若要在后台執行耗時的操作,請創建一個 BackgroundWorker,偵聽那些報告操作進度並在操作完成時發出信號的事件。 可以通過編程方式創建 BackgroundWorker,也可以將它從“工具箱”的“組件”選項卡中拖到窗體上。 如果在 Windows 窗體設計器中創建 BackgroundWorker,則它會出現在組件欄中,而且它的屬性會顯示在“屬性”窗口中。
語法
public class BackgroundWorker : Component
構造函數
名稱 | 說明 | |
---|---|---|
![]() |
BackgroundWorker | 初始化 BackgroundWorker 類的新實例。 |
屬性
名稱 | 說明 | |
---|---|---|
![]() |
CancellationPending | 獲取一個值,指示應用程序是否已請求取消后台操作。 |
![]() |
CanRaiseEvents | 獲取一個指示組件是否可以引發事件的值。 (繼承自 Component。) |
![]() |
Container | 獲取 IContainer,它包含 Component。 (繼承自 Component。) |
![]() |
DesignMode | 獲取一個值,用以指示 Component 當前是否處於設計模式。 (繼承自 Component。) |
![]() |
Events | 獲取附加到此 Component 的事件處理程序的列表。 (繼承自 Component。) |
![]() |
IsBusy | 獲取一個值,指示 BackgroundWorker 是否正在運行異步操作。 |
![]() |
Site | 獲取或設置 Component 的 ISite。 (繼承自 Component。) |
![]() |
WorkerReportsProgress | 獲取或設置一個值,該值指示 BackgroundWorker 能否報告進度更新。 |
![]() |
WorkerSupportsCancellation | 獲取或設置一個值,該值指示 BackgroundWorker 是否支持異步取消。 |
方法
事件
名稱 | 說明 | |
---|---|---|
![]() |
Disposed | 當通過調用 Dispose 方法釋放組件時發生。 (繼承自 Component。) |
![]() |
DoWork | 調用 RunWorkerAsync 時發生。 |
![]() |
ProgressChanged | 調用 ReportProgress 時發生。 |
![]() |
RunWorkerCompleted | 當后台操作已完成、被取消或引發異常時發生。 |
示例
本代碼運行環境:Windows XP, Visual Studio 2010, .NET Framework 4, C#
下面的代碼示例演示 BackgroundWorker 類異步執行耗時的基本知識。 下圖顯示輸出的示例。
要嘗試該代碼,可創建 Windows 窗體應用程序。 添加一個名為 resultLabel 的 Label 控件並添加兩個名為 startAsyncButton 和 cancelAsyncButton 的 Button 控件。 創建這兩個按鈕的 Click 事件處理程序。 從工具箱中的“組件”選項卡中,添加命名為 backgroundWorker1 的 BackgroundWorker 組件。 創建 DoWork、 ProgressChanged 和 BackgroundWorker 的 RunWorkerCompleted 事件處理程序。
在窗體的代碼中,用下列代碼替換現有代碼。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication5 { public partial class Form1 : Form { public Form1() { InitializeComponent(); backgroundWorker1.WorkerReportsProgress = true; backgroundWorker1.WorkerSupportsCancellation = true; } private void startAsyncButton_Click(object sender, EventArgs e) { if (backgroundWorker1.IsBusy != true) { // 啟動異步操作 backgroundWorker1.RunWorkerAsync(); } this.startAsyncButton.Enabled = false; } private void cancelAsyncButton_Click(object sender, EventArgs e) { if (backgroundWorker1.WorkerSupportsCancellation == true) { // 取消異步操作 backgroundWorker1.CancelAsync(); } this.startAsyncButton.Enabled = true; } //主任務的實現 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; for (int i = 1; i <= 10; 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) { resultLabel.Text = (e.ProgressPercentage.ToString() + "%"); } //處理后台操作結果 private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled == true) { resultLabel.Text = "Canceled!"; } else if (e.Error != null) { resultLabel.Text = "Error: " + e.Error.Message; } else { resultLabel.Text = "Done!"; } } } }