一個程序中需要進行大量的運算,並且需要在運算過程中支持用戶一定的交互,爲了獲得更好的用戶體驗,使用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);
}