一個程序中需要進行大量的運算,并且需要在運算過程中支持用戶一定的交互,為了獲得更好的用戶體驗,使用BackgroundWorker來完成這一功能.
BackgroundWorker類允許您在單獨的專用線程上運行操作。 耗時的操作(如下載和數據庫事務)在長時間運行時可能會導致用戶界面 (UI) 似乎處于停止響應狀態。
如果您需要能進行響應的用戶界面,而且面臨與這類操作相關的長時間延遲,則可以使用 BackgroundWorker類方便地解決問題(MSDN)。
若要在后臺執行耗時的操作,請創建一個 BackgroundWorker,偵聽那些報告操作進度并在操作完成時發出信號的事件。 可以通過編程方式創建 BackgroundWorker,
也可以將它從“工具箱”的“組件”選項卡中拖到窗體上。 如果在 Windows 窗體設計器中創建 BackgroundWorker,則它會出現在組件欄中,而且它的屬性會顯示在“屬性”窗口中(MSDN)。
屬性:
IsBusy:獲取一個值,指示 BackgroundWorker 是否正在運行異步操作。
WorkerReportsProgress:獲取或設置一個值,該值指示 BackgroundWorker 能否報告進度更新。
WorkerSupportsCancellation:獲取或設置一個值,該值指示 BackgroundWorker 是否支持異步取消。
事件:
DoWork:調用 RunWorkerAsync 時發生。
ProgressChanged:調用 ReportProgress 時發生。
RunWorkerCompleted:當后臺操作已完成、被取消或引發異常時發生。
實例:
窗體設計如下圖:

代碼實現:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 1; i <= 12; i++)
{
if (worker.CancellationPending == true)
{
e.Cancel = true;
break;
}
else
{
System.Threading.Thread.Sleep(500);
worker.ReportProgress(i * 10);
}
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
lbResult.Text = (e.ProgressPercentage.ToString() + "%"+e.UserState);
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled == true)
{
lbResult.Text = "Canceled!";
}
else if (e.Error != null)
{
lbResult.Text = "Error: " + e.Error.Message;
}
else
{
lbResult.Text = "Done!";
}
}
private void btnStartAsync_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy != true)
{
backgroundWorker1.RunWorkerAsync();
}
}
private void btnCancelAsync_Click(object sender, EventArgs e)
{
if (backgroundWorker1.WorkerSupportsCancellation == true)
{
backgroundWorker1.CancelAsync();
}
}
}
}
運行結果:


