在我們的程式中,經常會有一些耗時較長的運算,為了保證使用者體驗,不引起介面不回應,我們一般會採用多執行緒操作,讓耗時操作在後臺完成,完成後再進行處理或給出提示,在運行中,也會時時去刷新介面上的進度條等顯示,必要時還要控制後臺執行緒中斷當前操作。

 

以前,類似的應用會比較麻煩,需要寫的代碼較多,也很容易出現異常。在.net中,提供了一個元件BackgroundWorker就是專門解決這個問題的。BackgroundWorker類允許在單獨的專用線程上運行操作。 耗時的操作(如下載和資料庫事務)在長時間運行時可能會導致使用者介面(UI)似乎處於停止回應狀態。如果需要能進行回應的使用者介面,而且面臨與這類操作相關的長時間延遲,則可以使用BackgroundWorker類方便地解決問題。

 

使用這個元件其實非常簡單,例如,我們做一個類似如下介面的進度條的小例子,在後臺執行緒中進行耗時運算,同時刷新介面上的進度條。
過程如下:
1.新建一個windows表單應用程式,如:BackgroundWorkerProgressBarDemo
2.拖一個ProgressBar(progressBar1)和一個BackgroundWorker (backgroundWorker1)到Form上。
3.把下面的代碼copy過去就ok了,代碼注釋的很詳細,可以按照需要修改。




namespace BackgroundWorkerProgressBarDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

 

Shown += new EventHandler(Form1_Shown);

 

// To report progress from the background worker we need to set this property
backgroundWorker1.WorkerReportsProgress = true;

 

// This event will be raised on the worker thread when the worker starts
backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);

 

// This event will be raised when we call ReportProgress
backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
}

 

void Form1_Shown(object sender, EventArgs e)
{
// Start the background worker
backgroundWorker1.RunWorkerAsync();
}

 

// On worker thread so do our thing!
void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// Your background task goes here
for (int i = 0; i <= 100; i++)
{
// Report progress to 'UI' thread
backgroundWorker1.ReportProgress(i);
// Simulate long task
System.Threading.Thread.Sleep(100);
}
}

 

// Back on the 'UI' thread so we can update the progress bar
void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// The progress percentage is a property of e
progressBar1.Value = e.ProgressPercentage;
}
}
}




若要為後臺操作做好準備,請添加DoWork事件的事件處理常式,在此事件處理常式中調用耗時的操作。

 

若要開始此操作,請調用RunWorkerAsync。

 

若要收到進度更新的通知,請處理ProgressChanged 事件。

 

若要在操作完成時收到通知,請處理RunWorkerCompleted 事件。

 

注意:

 

您必須非常小心,確保在 DoWork 事件處理常式中不操作任何使用介面物件。 而應該通過 ProgressChanged 和 RunWorkerCompleted 事件與使用者介面進行通信。

 

BackgroundWorker 事件不跨 AppDomain 邊界進行封送處理。 請不要使用 BackgroundWorker 元件在多個 AppDomain 中執行多執行緒操作。

 

如果後臺操作需要參數,請在調用 RunWorkerAsync 時給出參數。 在 DoWork 事件處理常式內部,可以從 DoWorkEventArgs.Argument 屬性中提取該參數。

 

參考:

 

HTTP://msdn.microsoft.com/zh-cn/library/vstudio/System.ComponentModel.BackgroundWorker(v=vs.100).aspx

 

 
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()