最近修改公司以前項目看到有BackgroundWorker的使用,發現很是方便。總結出來以供日后使用。
BackgroundWorker 類允許您在單獨的專用線程上運行操作。 耗時的操作(如下載和數據庫事務)在長時間運行時可能會導致用戶界面 (UI) 似乎處於停止響應狀態。 如果您需要能進行響應的用戶界面,而且面臨與這類操作相關的長時間延遲,則可以使用 BackgroundWorker 類方便地解決問題。
若要在后台執行耗時的操作,先創建一個 BackgroundWorker,用於偵聽報告操作進度並在操作完成時發出信號的事件。 可以通過編程方式創建BackgroundWorker,也可以將它從“工具箱”的“組件”選項卡中拖到窗體上。 如果在 Windows 窗體設計器中創建 BackgroundWorker,則它會出現在組件欄中,而且它的屬性會顯示在“屬性”窗口中。
若要為后台操作做好准備,請添加 DoWork 事件的事件處理程序。 在此事件處理程序中調用耗時的操作。 若要開始此操作,請調用 RunWorkerAsync。 若要收到進度更新的通知,請處理 ProgressChanged 事件。 若要在操作完成時收到通知,請處理 RunWorkerCompleted 事件。最后處理完之后調用Dispose方法釋放資源。
界面圖片如下:
代碼如下:

namespace BackGroundDoWorkDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//WorkerReportsProgress屬性設置為True的時候才能夠調用ProgressChanged
bgwCalculate.WorkerReportsProgress = true;
//WorkerSupportsCancellation設置為True的時候才能夠進行中途取消操作。
bgwCalculate.WorkerSupportsCancellation = true;
}
/// <summary>
/// 開始計算操作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStart_Click(object sender, EventArgs e)
{
//判斷是否是正在進行進行處理中。
if (!bgwCalculate.IsBusy)
{
//RunWorkerAsync有兩個構造函數,可以通過但參數的構造函數傳遞參數到DoWork()中
//參數共耗費時間的處理方法等使用。
bgwCalculate.RunWorkerAsync(10);
btnStart.Enabled = false;
}
}
//取消正在進行的操作。
private void btnCancle_Click(object sender, EventArgs e)
{
//判斷是否支持取消操作
if (bgwCalculate.WorkerSupportsCancellation == true)
{
bgwCalculate.CancelAsync();
btnStart.Enabled = true;
}
}
/// <summary>
/// 后台工作時間對應的方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void bgwCalculate_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bwk = sender as BackgroundWorker;
int count = int.Parse(e.Argument.ToString());
for (int i = 1; i <= count; i++)
{
if (bwk.CancellationPending == true)
{
e.Cancel = true;
break;
}
else
{
// Perform a time consuming operation and report progress.
System.Threading.Thread.Sleep(500);
bwk.ReportProgress(i * 10);
}
}
}
/// <summary>
/// 取消事件對應的后台方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void bgwCalculate_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pgbShow.Step = 10;
pgbShow.PerformStep();
}
/// <summary>
/// 后台事件完成對應的處理方法。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void bgwCalculate_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled==true)
{
lbResult.Text = "取消";
}
else if(e.Error!=null)
{
lbResult.Text = e.Error.Message;
}
else
{
lbResult.Text = "完成";
}
}
}
}