BackgroundWorker的使用

一個程序中需要進行大量的運算,並且需要在運算過程中支持用戶一定的交互,爲了獲得更好的用戶體驗,使用BackgroundWorker來完成這一功能.
 
基本操作:
bgw.RunWorkerAsync()        :
    開始後臺運行執行,
    該函數後將觸發bgw.DoWorker事件,需要執行的操作寫在DoWorker事件響應函數裏,
    該函數也可以加參數,參數從DoWorker事件處理函數的e.Arguement裏獲取
 
bgw.CancelAsync()                :
    申請後臺程序停止,
    注意該函數不能實際停止後臺程序,只能將bgw的CancellationPending 值設爲true,需要自己在後臺運行的程序中判斷這一值,進而停止後臺程序的運行.
    注意本方法使用前,需要將bgw的WorkerSupportsCancellation 值設爲true,否則將不起作用.
 
bgw.ReportProgress()        :
    在後臺程序中調用,向主線程傳送進度信息,
    可以帶一個或兩個參數,一個爲INT類型的進度(0~100),一個爲自定義類型的參數,可以傳任意信息.
    調用後,將觸發bgw.ProgressChanged事件,可以將界面變化的代碼寫在該事件響應函數中,之前提到的兩個參數均可從bgw.ProgressChanged事件響應函數的參數e中獲取,分別爲e.ProgressPercentage和e.UserState.    
    注意本方法使用前,需要將bgw的WorkerReportsProgress值設爲true,否則將不會觸發事件.

開始後臺運行:
  bgw= new BackgroundWorker(); 
            bgw.WorkerSupportsCancellation = true;
            bgw.WorkerReportsProgress = true;

            bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
            bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
            bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);

            bgw.RunWorkerAsync();

DoWork事件處理函數:
 void bgw_DoWork(object sender, DoWorkEventArgs e) 
        {
            StartProgress();

        }   

WorkerCompleted事件處理函數(該函數在後臺處理完成後被觸發)
 void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
        {
            MessageBox.Show("處理完成");
        }

ProgressChanged事件處理函數,
 void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
        {
            if (e.UserState is int)
            {
                progressBar1.Value = (int)e.ProgressPercentage;
                label2.Text = e.UserState.ToString();
            }
            else if (e.UserState is List<object>)
            {
                List<object> tmp = (List<object>)e.UserState;
                progressBar1.Value = e.ProgressPercentage;
                label2.Text = tmp[0].ToString();
                this.label1.Text = tmp[1].ToString();
                this.listBox1.Items.Insert(0, tmp[2]);
            }
        }


後臺運行的代碼
 private void StartProgress()         
{
    //do sth

    bgw.ReportProgress(per,paraInt);
}










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