1. 程式人生 > >C#後臺執行控制元件BackgroundWorker的使用方法

C#後臺執行控制元件BackgroundWorker的使用方法

當我們從使用者UI點選載入一些檔案並進行處理的時候,往往很佔時間,如果直接在UI程序(預設就是UI程序)進行處理,使用者介面會出現卡死的現象。

這會給使用者造成很不好的使用者體驗。

正確的操作方法是,當用戶點選載入檔案的按鈕->觸發彈出資料夾彈窗->選擇->這時已獲得使用者選擇的檔案路徑->然後觸發後臺程式進行載入、資料處理(這些都在後臺完成)->處理完成回撥->在UI提示資料已經處理完成->在回撥函式裡重新整理相應控制元件的顯示資訊

這裡的一個關鍵是,在進入資料載入開始,即讓後臺程式接管,在此過程中,不可以在後臺執行緒操作UI控制元件,直到完成回撥,在回撥函式裡可以操作。

1、新增BackgroundWorker到程式

對winform來說就是把此控制元件拖放到介面,他不會出現在介面,而是會有一條線出現在介面的下方,然後此控制元件線上的下面,表示此控制元件不在介面上顯示,但是已經新增到程式了。

只要拖放進去,在*.Designer.cs的InitializeComponent函式中就會出現此例項定義:

this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();

如果我們在UI上雙擊此控制元件,則會在From1.cs自動新增此控制元件的回撥並進入此函式體(新增其他控制元件也同理):
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e){}
但是我們先不要通過此方式添加回調,而是在後面集中新增。

2、在From1.cs中添加回調

在From1.cs的建構函式中,新增這些回撥:

            InitializeComponent();// 在此函式下新增
            this.backgroundWorker1.DoWork += backgroundWorker1_DoWork;//工作執行緒回撥,將要執行的程式碼放在此函式裡
            this.backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged;//當進度改變時回撥
            this.backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted);//當完成時回撥
            this.backgroundWorker1.WorkerReportsProgress = true;//此屬性必須設定,否則讀取不到進度
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
	// 要執行的後臺程式碼
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
	// 通過進度條顯示進度
	// 注意要UI介面新增一個進度條控制元件和一個label控制元件
    this.progressBar1.Value = e.ProgressPercentage;
    this.label1.Text = e.UserState.ToString();
    this.label1.Update();
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
	// 後臺執行完畢,彈窗提示
    MessageBox.Show("completed!");
}

3、進度條

在工作程序中要根據工作完成量設定一個百分比:
this.backgroundWorker1.ReportProgress(i, String.Format("{0}%", i));
然後在progressChanged函式裡,可以通過e.ProgressPercentage獲取到這個百分比,並可以操控ui顯示。