使用BackgroundWorker組件

來源:互聯網
上載者:User
文章目錄
  • 開始
  • 顯示後台操作進度
  • 取消後台操作
  • 後台操作完成後,反饋給使用者
  • 從後台操作傳回值
  • 結束

BackgroundWorker 組件用來執行諸如資料庫事務、檔案下載等耗時的非同步作業。

開始

在應用程式中添加一個BackgroundWorker執行個體,如果用的是VS,可以從工具上直接拖到應用程式:

BackgroundWorker backgroundWorker1 = new BackgroundWorker();

為了開始在後台操作,必須調用BackgroundWorker的RunWorkerAsync()方法,當調用此方時,BackgroundWorker 通過觸發DoWork 事件,開始執行後台操作,DoWork 事件的代碼是在另一個線程裡執行的。代碼如下:

代碼一:

BackgroundWorker backgroundWorker1 = new BackgroundWorker();

//在另一個線程裡開始操作(btnStart是一個按鈕控制項)

//也可以利用RunWokerAsync()方法傳遞參數,

private void btnStart_Click(object sender, EventArgs e)

{

          backgroundWorker1.RunWokerAsync(2000/*參數是可選的*/);

}

//DoWork事件在另一個線程裡執行

private void backgroundWorker1_DoWork(objectsender,DoWorkeventArgs e)

{

        //允許長時間的操作

        int input = (int)e.Argument;

        Thread.Sleep(input);

}

顯示後台操作進度

為了顯示後台操作的執行進度,首先要使WorkerReportsProgress 等於true,然後調用BackgroundWorker的ReportProgress()方法,通過它傳遞操作完成的進度值,此外,該方法觸發ProgressChanged事件,在是此事件中,通過ProgressChangedEventArgs的執行個體,接收到主線程傳遞過來的參數。

代碼二:

BackgroundWorker backgroundWorker1 = new BackgroundWorker();

backgroundWorker1.WorkerReportsProgress = true;

private void btnStart_Click(object sender, EventArgs e)

{

            backgroundWorker1.RunWokerAsync();

}

private void backgroundWorker1_DoWork(object sender, DoWorkeventArgs e)

{

      for (int i = 1; i < 11; i++)

     {

              Thread.Sleep(2000);

             backgroundWorker1.ReportProgress(i*10);

     }

}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)

{

      //progressBar1是ProgressBar控制項

      progressBar1.Value = e.ProgressPercentage;

}

取消後台操作

為了使 BackgroundWorker 可以取消後台正在執行的操作,首先要把屬性WorkerSupportsCancellation 的值設定為 true。接著調用CancelAsync()方法,該方法使得屬性CancellationPending 為true,利用CancellationPending 屬性,可以判斷是否取消後台非同步作業。

代碼三:

BackgroundWorker backgroundWorker1 = new BackgroundWorker();

backgroundWorker1.WorkerReportsProgress = true;

backgroundWorker1.WorkerSupportsCancellation = true;

private void btnStart_Click(object sender, EventArgs e)

{

       backgroundWorker1.RunWokerAsync();

}

private void btnCancel_Click(object sender, EventArgs e)

{

      backgroundWorker1.CancelAsync();

}

private void backgroundWorker1_DoWork(object sender, DoWorkeventArgs e)

{

      for (int i = 1; i < 11; i++)

     {

             Thread.Sleep(2000);

             backgroundWorker1.ReportProgress(i*10);

            if(backgroundWorker1.CancellationPending)

            {

                   e.Cancel = true;

                   return;

             }

      }

}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)

{

         progressBar1.Value = e.ProgressPercentage;

}

 

後台操作完成後,反饋給使用者

當後台操作完成以後,無論是completed 還是cancelled,則RunWorkerCompleted 事件被觸發,通過此方法可以將後台操作的完成結果反饋給使用者;

另外,通過RunWorkerCompletedEventArgs執行個體的Cancelled 屬性,以判斷是否是Cancel操作使得後台操作終止;

程式碼片段:

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

{

if(e.Cancelled)

{

       MessageBox.Show("Operation Cancelled");

}

else

{

       MessageBox.Show("OperationCompleted");

}

}

從後台操作傳回值

在執行DoWork 事件時,DoWorkEventArgs 執行個體的Result 屬性,傳回值到使用者;在RunWorkerCompleted 事件裡,RunWorkerCompletedEventArgs 執行個體的Result 屬性接收值;

程式碼片段:

private void backgroundWorker1_DoWork(object sender, DoWorkeventArgs e)

{

Thread.Sleep(2000);

//在此處設定傳回值

e.Result = 10;

}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

{

//在此處接收傳遞迴來的值

int returnValue = (int)e.Result;

}

 

結束

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.