文章出處

簡介

BackgroundWorker是.net里用來執行多線程任務的控件,它允許編程者在一個單獨的線程上執行一些操作。耗時的操作(如下載和數據庫事務)在長時間運行時可能會導致用戶界面 (UI) 始終處于停止響應狀態。如果您需要能進行響應的用戶界面,而且面臨與這類操作相關的長時間延遲,則可以使用BackgroundWorker類方便地解決問題。
該控件有三個事件:
DoWork 、ProgressChanged 和 RunWorkerCompleted
在程序中調用RunWorkerAsync方法則會啟動DoWork事件的事件處理,當在事件處理過程中,調用 ReportProgress方法則會啟動ProgressChanged事件的事件處理,而當DoWork事件處理完成時,則會觸發RunWorkerCompleted事件。
您必須非常小心,確保在 DoWork 事件處理程序中不操作任何用戶界面對象。而應該通過 ProgressChanged和 RunWorkerCompleted 事件與用戶界面進行通信。

三個事件

DoWork 事件

 
void backgroundWorker1_DoWork( Object sender, DoWorkEventArgs e )
其中句柄sender指向的就是該BackgroundWorker控件。
第二個參數e有三個屬性,Argument,Cancel和Result。
 
Argument:
大家應該還記得如何觸發DoWork事件吧?對了,就是在程序中調用RunWorkerAsync方法,RunWorkerAsync方法有兩種重載,第一種是無參形式,第二種是有一個指向Object^類型的參數,如果你調用的是有參類型的RunWorkerAsync,則DoWork事件處理程序的第二個參數e的Argment屬性將會返回一個指向你傳遞過來的這個參數。
 
Cancel:
DoWork 事件處理程序中的代碼應定期檢查 CancellationPending屬性值,并在該值為true時中止操作。出現這種情況時,可以將 System.ComponentModel.DoWorkEventArgs 的 Cancel標志設置為true,同時將 RunWorkerCompleted 事件處理程序中的 System.ComponentModel.RunWorkerCompletedEventArgs的 Cancelled 標志設置為true
 
Result:
等下面講到RunWorkerCompleted事件時再細說。

RunWorkerCompleted事件

當DoWork事件處理完成之后,將會觸發該事件。
void backgroundWorker1_RunWorkerCompleted( Object sender, RunWorkerCompletedEventArgs e )
現在主要講第二個參數e,最重要的屬性是Result。
在DoWork事件中,你將Result設置成什么,這里的Result就返回什么。

ProgressChanged事件

在DoWork事件的處理過程中,如果調用ReportProgress則會發生該事件。
void backgroundWorker1_ProgressChanged( Object sender, ProgressChangedEventArgs e )
先來說說ReportProgress的兩種重載:
void ReportProgress(int percentProgress)
void ReportProgress(int percentProgress,Object userState)
ProgressChanged事件處理程序的第二個參數e有一個ProgressPercentage屬性,它就由ReportProgress的第一個參數percentProgress來提供。這個參數一般用來報告該后臺操作完成的進度,然后用ProgressChanged的第二個參數e的ProgressPercentage屬性來獲取該進度信息。如果用戶還想傳遞更多的信息,可以使用ReportProgress的第二種重載,它的第二個參數userState將會傳遞給ProgressChanged事件的參數e的UserState屬性。
好,下面來一段MSDN上的例子:
namespace BwTester
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
BackgroundWorker backgroundWorker;
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker = new BackgroundWorker();
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);
backgroundWorker.RunWorkerAsync();
}
void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 500; i++)
{
backgroundWorker.ReportProgress(i);
Thread.Sleep(100);
}
}
}
}

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()