以下將使用方法整理:
public partial class BackgroundWorker_Practice : Form {
public BackgroundWorker[] bk; //宣告一個 BackgroundWorker 的陣列
private void button1_Click(object sender, EventArgs e) { //拉一個按鈕點二下 事件內呼叫start()
start();
}
private void start(){
bk=new BackgroundWorker[10];//這裡幾個要看自已的需要 此例子是用10個 下面for迴圈也是10個
for (int i = 0; i < 10; i++) {
bk[i] = new BackgroundWorker(); // 實體化一個要用的BackGroundWorker
bk[i].WorkerReportsProgress = true; //才能用ReportsProgress方法,會引發ProgressChanged的事件,在此方法裡才能對UI做變動,例如改顯示的文字。
bk[i].DoWork += new DoWorkEventHandler(bk_DoWork); //把DoWork事件 指定到bk_DoWork方法
bk[i].ProgressChanged += new ProgressChangedEventHandler(bk_ProgressChanged); //把ProgressChanged事件 指定到bk_ProgressChanged方法
bk[i].RunWorkerAsync( i ); //這個方法是啟動了這個BackgroundWorker 把參數 i 傳到 DoWork事件指定的方法 bk_DoWork()
}
}
private void bk_DoWork(object sender, DoWorkEventArgs e) {
int i = (int)e.Argument; //這是把剛傳進來的參數 讀值的方法 當然 如果傳的是字串 那就要強迫轉型(string) 並指定給string變數
string test= ( i * 168).Tostring(); //這裡把傳進來的參數亂改了一下 準備引發ProgressChanged事件 把參數顯示到UI(使用者介面)上
BackgroundWorker bgk=(BackgroundWorker)sender; //先把sender也就是當下使用的這個物件 還原成BackgroundWorker
bgk..ReportProgress(i,test);// 這個方法會引發ProgressChanged事件 也就會執行上面定義的bk_ProgressChanged()方法
//傳遞的參數有二個 ,第一個位置是進度 i 通常是整數 用來回報現在處理進度用的,第二個是test的位置是用來傳自訂參數的。
}
private void bk_ProgressChanged(object sender, ProgressChangedEventArgs e) {
int i = e.ProgressPercentage; //讀進度的方法
string test = (string)e.UserState; //讀自訂參數的方法
label1.Text += test ; //把結果附加到 Label 上顯示
}
}
//最後還有一個 事件叫 RunWorkerCompleted 也就是執行完後要做的事 目前沒用到 需要再練習吧!