1. 程式人生 > 程式設計 >c# BackgroundWorker使用方法

c# BackgroundWorker使用方法

在 WinForms 中,有時要執行耗時的操作,在該操作未完成之前操作使用者介面,會導致使用者介面停止響應。解決的方法就是新開一個執行緒,把耗時的操作放到執行緒中執行,這樣就可以在使用者介面上進行其它操作。新建執行緒可以用 Thread 類,可以實現多執行緒同時操作。簡單的方法可以通過 BackgroundWorker 類實現。

BackgroundWorker 可以用來更新UI介面,但是通常用來Progressbar(進度條)控制元件

例如更新UI

private void Form1_Load(object sender,EventArgs e)
{
   this.backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
{
    this.textBox1.Text = "UI";
}

用 BackgroundWorker 類執行耗時的操作

BackgroundWorker 類在 System.ComponentModel 名稱空間下。
VS 的工具箱時有一個 BackgroundWorker 元件,就是這個類。

backgroundwork主要的事件及引數:

1.DoWork——當執行BackgroundWorker.RunWorkerAsync方法時會觸發該事件,並且傳遞DoWorkEventArgs引數;

2.RunWorkerCompleted——非同步操作完成或中途終止會觸發該事件。

3.ProgressChanged——操作處理中獲得的處理狀態變化,通過BackgroundWorker.ReportProgress(int)方法觸發該事件,並且傳遞ProgressChangedEventArgs,其中包含了處理的百分比,這個引數在UI介面上設定progressbar控制元件。

backgroundwork主要的方法:

1. BackgroundWorker.RunWorkerAsync——“起動”非同步呼叫的方法有兩次過載RunWorkerAsync(),RunWorkerAsync(object argument),第二個過載提供了一個引數,可以供非同步呼叫使用。(如果有多個引數要傳遞怎麼辦,使用一個類來傳遞他們吧)。呼叫該方法後會觸發DoWork事件。並且為處理DoWork事件的函式傳遞DoWorkEventArg引數,其中包含了RunWorkerAsync傳遞的引數。在相應DoWork的處理函式中就可以做具體的複雜操作。

2. BackgroundWorker.ReportProgress——需要在一個冗長的操作中向用戶不斷反饋進度,這樣的話就可以呼叫的ReportProgress(int percent),在呼叫 ReportProgress 方法時,觸發ProgressChanged事件。提供一個在 0 到 100 之間的整數,它表示後臺活動已完成的百分比。你也可以提供任何物件作為第二個引數,允許你 給事件處理程式傳遞狀態資訊。作為傳遞到此過程的 ProgressChangedEventArgs 引數屬性,百分比和你自己的物件(如果提供的話)均要被傳遞到 ProgressChanged 事件處理程式。這些屬性被分別命名為 ProgressPercentage 和 UserState,並且你的事件處理程式可以以任何需要的方式使用它們。(注意:只有在BackgroundWorker.WorkerReportsProgress屬性被設定為true該方法才可用)。

3. BackgroundWorker.CancelAsync——但需要退出非同步呼叫的時候,就呼叫的這個方法。但是樣還不夠,因為它僅僅是將BackgroudWorker.CancellationPending屬性設定為true。你需要在具體的非同步呼叫處理的時候,不斷檢查BackgroudWorker.CancellationPending是否為true,如果是真的話就退出。(注意:只有在BackgroundWorker.WorkerSupportsCancellation屬性被設定為true該方法才可用)。

BackgroundWorker元件

重要屬性:

1、CancellationPending 獲取一個值,指示應用程式是否已請求取消後臺操作。通過在DoWork事件中判斷CancellationPending屬性可以認定是否需要取消後臺操作(也就是結束執行緒);

2、 WorkerReportsProgress :獲取或設定一個值,該值指示BackgroundWorker能否報告進度更新

重要方法:

1、CancelAsync 請求取消掛起的後臺操作

2、RunWorkerAsync 開始執行後臺操作

3、ReportProgress 引發ProgressChanged事件

重要事件:

1、DoWork 呼叫 RunWorkerAsync 時發生

2、ProgressChanged 呼叫 ReportProgress 時發生

3、RunWorkerCompleted 當後臺操作已完成、被取消或引發異常時發生

另外還有三個重要的引數是RunWorkerCompletedEventArgs以及DoWorkEventArgs、ProgressChangedEventArgs。

例子:

c# BackgroundWorker使用方法

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Delegate3
{
  public partial class Form1 : Form
  {

    public Form1()
    {
      InitializeComponent();
    }
    
    private void button1_Click(object sender,EventArgs e)
    {
      //啟動非同步呼叫方法
      //呼叫RunWorkerAsync()方法,會觸發DoWork事件
      this.backgroundWorker2.RunWorkerAsync();
    }

    private void backgroundWorker2_DoWork(object sender,DoWorkEventArgs e)
    {
      backgroundWorker2.WorkerReportsProgress = true;
      for (int i = 1; i <= 100; i++)
      {
        //這裡判斷一下是否使用者要求取消後臺進行,並可以儘早退出。
        //可以通過呼叫CancelAsync方法設定CancellationPending的值為false
        if (backgroundWorker2.CancellationPending)
        {
          backgroundWorker2.ReportProgress(i,String.Format("{0}%,操作被使用者申請中斷",i));
        }

        //呼叫 ReportProgress 方法,會觸發ProgressChanged事件
        backgroundWorker2.ReportProgress(i,String.Format("{0}%",i));
        System.Threading.Thread.Sleep(10);
      }
    }

    private void backgroundWorker2_ProgressChanged(object sender,ProgressChangedEventArgs e)
    {
      this.progressBar1.Value = e.ProgressPercentage;
      this.label1.Text = e.UserState.ToString();
      this.label1.Update();
    }

    private void backgroundWorker2_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
    {
      //這是結束後做的事情
      MessageBox.Show("完成");
    }
  }
}

以上就是c# BackgroundWorker使用方法的詳細內容,更多關於c# BackgroundWorker用法的資料請關注我們其它相關文章!