文章目錄
- 開始
- 顯示後台操作進度
- 取消後台操作
- 後台操作完成後,反饋給使用者
- 從後台操作傳回值
- 結束
BackgroundWorker 組件用來執行諸如資料庫事務、檔案下載等耗時的非同步作業。
開始
在應用程式中添加一個BackgroundWorker執行個體,如果用的是VS,可以從工具上直接拖到應用程式:
BackgroundWorker backgroundWorker1 = new BackgroundWorker();
為了開始在後台操作,必須調用BackgroundWorker的RunWorkerAsync()方法,當調用此方時,BackgroundWorker 通過觸發DoWork 事件,開始執行後台操作,DoWork 事件的代碼是在另一個線程裡執行的。代碼如下:
代碼一:
BackgroundWorker backgroundWorker1 = new BackgroundWorker();
//在另一個線程裡開始操作(btnStart是一個按鈕控制項)
//也可以利用RunWokerAsync()方法傳遞參數,
private void btnStart_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWokerAsync(2000/*參數是可選的*/);
}
//DoWork事件在另一個線程裡執行
private void backgroundWorker1_DoWork(objectsender,DoWorkeventArgs e)
{
//允許長時間的操作
int input = (int)e.Argument;
Thread.Sleep(input);
}
顯示後台操作進度
為了顯示後台操作的執行進度,首先要使WorkerReportsProgress 等於true,然後調用BackgroundWorker的ReportProgress()方法,通過它傳遞操作完成的進度值,此外,該方法觸發ProgressChanged事件,在是此事件中,通過ProgressChangedEventArgs的執行個體,接收到主線程傳遞過來的參數。
代碼二:
BackgroundWorker backgroundWorker1 = new BackgroundWorker();
backgroundWorker1.WorkerReportsProgress = true;
private void btnStart_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWokerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkeventArgs e)
{
for (int i = 1; i < 11; i++)
{
Thread.Sleep(2000);
backgroundWorker1.ReportProgress(i*10);
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//progressBar1是ProgressBar控制項
progressBar1.Value = e.ProgressPercentage;
}
取消後台操作
為了使 BackgroundWorker 可以取消後台正在執行的操作,首先要把屬性WorkerSupportsCancellation 的值設定為 true。接著調用CancelAsync()方法,該方法使得屬性CancellationPending 為true,利用CancellationPending 屬性,可以判斷是否取消後台非同步作業。
代碼三:
BackgroundWorker backgroundWorker1 = new BackgroundWorker();
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
private void btnStart_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWokerAsync();
}
private void btnCancel_Click(object sender, EventArgs e)
{
backgroundWorker1.CancelAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkeventArgs e)
{
for (int i = 1; i < 11; i++)
{
Thread.Sleep(2000);
backgroundWorker1.ReportProgress(i*10);
if(backgroundWorker1.CancellationPending)
{
e.Cancel = true;
return;
}
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
後台操作完成後,反饋給使用者
當後台操作完成以後,無論是completed 還是cancelled,則RunWorkerCompleted 事件被觸發,通過此方法可以將後台操作的完成結果反饋給使用者;
另外,通過RunWorkerCompletedEventArgs執行個體的Cancelled 屬性,以判斷是否是Cancel操作使得後台操作終止;
程式碼片段:
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if(e.Cancelled)
{
MessageBox.Show("Operation Cancelled");
}
else
{
MessageBox.Show("OperationCompleted");
}
}
從後台操作傳回值
在執行DoWork 事件時,DoWorkEventArgs 執行個體的Result 屬性,傳回值到使用者;在RunWorkerCompleted 事件裡,RunWorkerCompletedEventArgs 執行個體的Result 屬性接收值;
程式碼片段:
private void backgroundWorker1_DoWork(object sender, DoWorkeventArgs e)
{
Thread.Sleep(2000);
//在此處設定傳回值
e.Result = 10;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//在此處接收傳遞迴來的值
int returnValue = (int)e.Result;
}
結束