Keywords: C# .NET BackgroundWorker
Source: http://txw1958.cnblogs.com/
BackgroundWorker是.NET Framework 里用來執(zhí)行多線程任務(wù)的控件,它允許開發(fā)人員在一個(gè)單獨(dú)的線程上執(zhí)行一些操作。耗時(shí)的操作(如下載和數(shù)據(jù)庫(kù)事務(wù))在長(zhǎng)時(shí)間運(yùn)行時(shí)可能會(huì)導(dǎo)致用戶界面 (UI) 始終處于停止響應(yīng)狀態(tài)。如果您需要能進(jìn)行響應(yīng)的用戶界面,而且面臨與這類操作相關(guān)的長(zhǎng)時(shí)間延遲,則可以使用 BackgroundWorker 類方便地解決問題。
若要在后臺(tái)執(zhí)行耗時(shí)的操作,請(qǐng)創(chuàng)建一個(gè) BackgroundWorker,偵聽那些報(bào)告操作進(jìn)度并在操作完成時(shí)發(fā)出信號(hào)的事件。 可以通過編程方式創(chuàng)建 BackgroundWorker,也可以將它從“工具箱”的“組件”選項(xiàng)卡中拖到窗體上。 如果在 Windows 窗體設(shè)計(jì)器中創(chuàng)建 BackgroundWorker,則它會(huì)出現(xiàn)在組件欄中,而且它的屬性會(huì)顯示在“屬性”窗口中。
語法
public class BackgroundWorker : Component
構(gòu)造函數(shù)
屬性
方法
事件
示例
本代碼運(yùn)行環(huán)境:Windows XP, Visual Studio 2010, .NET Framework 4, C#
下面的代碼示例演示 BackgroundWorker 類異步執(zhí)行耗時(shí)的基本知識(shí)。 下圖顯示輸出的示例。

要嘗試該代碼,可創(chuàng)建 Windows 窗體應(yīng)用程序。 添加一個(gè)名為 resultLabel 的 Label 控件并添加兩個(gè)名為 startAsyncButton 和 cancelAsyncButton 的 Button 控件。 創(chuàng)建這兩個(gè)按鈕的 Click 事件處理程序。 從工具箱中的“組件”選項(xiàng)卡中,添加命名為 backgroundWorker1 的 BackgroundWorker 組件。 創(chuàng)建 DoWork、 ProgressChanged 和 BackgroundWorker 的 RunWorkerCompleted 事件處理程序。
在窗體的代碼中,用下列代碼替換現(xiàn)有代碼。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication5
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
}
private void startAsyncButton_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy != true)
{
// 啟動(dòng)異步操作
backgroundWorker1.RunWorkerAsync();
}
this.startAsyncButton.Enabled = false;
}
private void cancelAsyncButton_Click(object sender, EventArgs e)
{
if (backgroundWorker1.WorkerSupportsCancellation == true)
{
// 取消異步操作
backgroundWorker1.CancelAsync();
}
this.startAsyncButton.Enabled = true;
}
//主任務(wù)的實(shí)現(xiàn)
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 1; i <= 10; i++)
{
if (worker.CancellationPending == true)
{
e.Cancel = true;
break;
}
else
{
// 執(zhí)行計(jì)時(shí)操作并且報(bào)告進(jìn)度
System.Threading.Thread.Sleep(500);
worker.ReportProgress(i * 10);
}
}
}
//更新進(jìn)度
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
resultLabel.Text = (e.ProgressPercentage.ToString() + "%");
}
//處理后臺(tái)操作結(jié)果
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled == true)
{
resultLabel.Text = "Canceled!";
}
else if (e.Error != null)
{
resultLabel.Text = "Error: " + e.Error.Message;
}
else
{
resultLabel.Text = "Done!";
}
}
}
}