winform控件之BackgroundWorker

BackgroundWorker控件其實是對Thread的一層封裝,使我們可以快速的創建一個線程,並且能夠報告進度,暫停,取消以及完成後進行其他的處理,當我們需要執行一些耗時的操作,又不想讓當前界面出於無響應的狀態的時候,就可以考慮使用BackedWorker控件,以異步的方式來執行。

 

1.BackgroundWorker類介紹

 

1.1. 四個常用屬性:

public bool IsBusy { get; }    //只讀屬性,用來判斷當前線程是否正在工作中

public bool WorkerReportsProgress { get; set; }   //決定當前線程是否能報告進度

public bool WorkerSupportsCancellation { get; set; }   //決定當前線程能否取消

public bool CancellationPending { get; }    //只讀屬性,用來判斷是否發送了取消線程的消息(當調用CancelAsync()方法時,被設置爲true)

1.2. 三個常用事件:

public event DoWorkEventHandler DoWork; //啓動線程,線程的主要邏輯,調用RunWorkerAsync()時觸發該事件

public event ProgressChangedEventHandler ProgressChanged; //報告進度,如果想要和UI進行交互必須要通過這個函數

public event RunWorkerCompletedEventHandler RunWorkerCompleted; //結束,當線程運行完畢、發生異常和調用CancelAsync()方法這三種方式都會觸發該事件

1.3. 三個常用方法:

public void RunWorkerAsync(); //啓動線程,觸發DoWork事件
public void RunWorkerAsync(object argument);

public void ReportProgress(int percentProgress); //報告進度,觸發ProgressChanged事件
public void ReportProgress(int percentProgress, object userState);

public void CancelAsync(); //取消線程,將CancellationPending設置爲true

 

2.BackgroundWorker用法

下面我們參照MSDN文檔,寫一個簡單的Demo例程,來看看BackedWorker的用法

2.1界面佈局

界面佈局如下,

兩個Button,一個名爲startAsync,另一個名爲cancelAsyn,

一個progressbar名爲progressbar1

一個label名爲resultLabel

當然,還必須要有一個backgroundWorker控件,名爲backgroundWorker1

2.2用法示例

使用代碼如下

namespace WindowsFormsApplication1
{
    public partial class FormMain : Form
    {
        public FormMain(ArrayList arrip_list)
        {
            InitializeComponent();

            progressBar1.Minimum = 0;          //設置progressbar的最小值
            progressBar1.Maximum = 100;        //設置progressbar的最大值

            backgroundWorker1.WorkerReportsProgress = true;        //可以彙報進度,只有置true,我們纔可以和UI界面進行交互,否則backgroundWorker無法操控其他控件
            backgroundWorker1.WorkerSupportsCancellation = true;   //可以被取消

            backgroundWorker1.DoWork += backgroundWorker1_DoWork;
            backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged;
            backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
        }

        void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //backgroundWorker結束
            if (e.Cancelled == true)
            {
                resultLabel.Text = "Canceled!";
            }
            else if (e.Error != null)
            {
                resultLabel.Text = "Error: " + e.Error.Message;
            }
            else
            {
                resultLabel.Text = "Done!";
            }
        }

        void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            //設置進度條進度和result_result來顯示進度
            resultLabel.Text = e.ProgressPercentage.ToString() + "%";
            progressBar1.Value = e.ProgressPercentage;
        }

        void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            //throw new NotImplementedException();
            //每間隔500ms之後,進度增加10%
            //注意!由於backgroundWorker是一個後臺線程,所以他沒有辦法直接操控其他控件
            //我們必須調用ReportProgress,然後在這個函數裏面纔可以和UI進行交互
            for (int i = 0; i <= 10; i++)
            {
                if (backgroundWorker1.CancellationPending == true)
                {
                    e.Cancel = true;
                    break;
                }
                else
                { 
                    System.Threading.Thread.Sleep(500);
                    backgroundWorker1.ReportProgress(i * 10);
                }
            }
        }

        private void startAsyncButton_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.IsBusy != true)
            {
                backgroundWorker1.RunWorkerAsync();    //啓動backgroundWorker
            }
        }

        private void cancelAsyncButton_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.WorkerSupportsCancellation == true)
            {
                backgroundWorker1.CancelAsync();       //取消backgroundWorker
            }
        }
    }
}

 

參考文獻

BackgroundWorker簡單實用(簡便的異步操作)

BackgroundWorker Class

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章