以下將使用方法整理:

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 也就是執行完後要做的事 目前沒用到 需要再練習吧!

arrow
arrow

    小新 發表在 痞客邦 留言(0) 人氣()