C#中的BackgroundWorker控件

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 是否支持異步取消。

 方法

  名稱 說明
CancelAsync 請求取消掛起的後臺操作。
CreateObjRef 創建一個對象,該對象包含生成用於與遠程對象進行通信的代理所需的全部相關信息。 (繼承自MarshalByRefObject。)
Dispose() 釋放由 Component 使用的所有資源。 (繼承自 Component。)
Dispose(Boolean) 釋放 Component 佔用的非託管資源,也可以選擇釋放託管資源。 (繼承自 Component。)
Equals(Object) 確定指定的 Object 是否等於當前的 Object (繼承自 Object。)
Finalize 在通過垃圾回收將 Component 回收之前,釋放非託管資源並執行其他清理操作。 (繼承自 Component。)
GetHashCode 用作特定類型的哈希函數。 (繼承自 Object。)
GetLifetimeService 檢索控制此實例的生存期策略的當前生存期服務對象。 (繼承自 MarshalByRefObject。)
GetService 返回一個對象,該對象表示由 Component 或它的 Container 提供的服務。 (繼承自 Component。)
GetType 獲取當前實例的 Type (繼承自 Object。)
InitializeLifetimeService 獲取控制此實例的生存期策略的生存期服務對象。 (繼承自 MarshalByRefObject。)
MemberwiseClone() 創建當前 Object 的淺表副本。 (繼承自 Object。)
MemberwiseClone(Boolean) 創建當前 MarshalByRefObject 對象的淺表副本。 (繼承自 MarshalByRefObject。)
OnDoWork 引發 DoWork 事件。
OnProgressChanged 引發 ProgressChanged 事件。
OnRunWorkerCompleted 引發 RunWorkerCompleted 事件。
ReportProgress(Int32) 引發 ProgressChanged 事件。
ReportProgress(Int32, Object) 引發 ProgressChanged 事件。
RunWorkerAsync() 開始執行後臺操作。
RunWorkerAsync(Object) 開始執行後臺操作。
ToString 返回包含 Component 的名稱的 String(如果有)。 不應重寫此方法。 (繼承自 Component。)

事件

  名稱 說明
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!";
            }
        }
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章