C#中的BackgroundWorker控件


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

 方法

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM