BackgroundWorker使用入門

來源:互聯網
上載者:User

 

 說實話,我就壓根不知道有這麼一個控制項。今天周末實在不想幹正事,開啟vs2005竟然看到了這個控制項,根據這個名字大概就能意識到是一個關於線程後台執行的東東,因為最近很多東西都是我自己寫線程,後台運行,操作UI控制項的時候自己寫委託。既然microsoft自己搞了這麼一個東西出來,肯定比較有意思,於是Google之。。。發現使用起來還是很簡單。大概說一下用法。

3個函數:

DoWork:具體的線程執行的代碼塊,就是讓這個線程做什麼的,自己填充內容。。
ProgressChanged:用於更新進度的回調,比如有一個進度條,當doWork中執行了任務的時候,調用BackgroundWork的ReportProgress方法,就可以把進度報告出來,然後這個函數捕獲報告的內容,進行具體的進度操作。使用該函數的話,必須將BackgroundWork的WorkerReportsProgress屬性設定為true。
RunWorkerCompleted:當線程執行完內容的回呼函數。

還有一個屬性:WorkerSupportsCancellation 就是是否允許讓線程掛起。

 

給個簡單代碼,這個裡麵包含了擱置動作,但是裡面有個地方就是掛起後,怎麼接下來操作?比如恢複還是終止,我也沒搞懂怎麼弄,高手知道的話可以補充下:

 

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Threading;namespace BackgroundWorker{    public partial class Form1 : Form    {        int i = 0;        public Form1()        {            InitializeComponent();        }        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)        {            while (i < 10)            {                if (!((System.ComponentModel.BackgroundWorker)sender).CancellationPending)                {                    //this.textBox1.Text = i + "";                    i++;                    this.backgroundWorker1.ReportProgress(i);                    Thread.Sleep(500);                }                            }        }        private void button1_Click(object sender, EventArgs e)        {            if (backgroundWorker1.CancellationPending)            {                MessageBox.Show("正在運行還沒停止");                // 這個地方如何讓background停止或者            }            else            {                this.backgroundWorker1.RunWorkerAsync();            }        }        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)        {            if (e.Cancelled)            {                this.textBox1.Text = "操作取消";            }            else            {                this.textBox1.Text = "操作完畢";            }                    }        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)        {            this.textBox1.Text = e.ProgressPercentage + "";            this.progressBar1.Value = e.ProgressPercentage;        }        private void button2_Click(object sender, EventArgs e)        {            this.backgroundWorker1.CancelAsync();        }    }}

 

 

再來從網上找來段文字補充下對BackgroundWorker的理解吧,轉的哦:

在VS2005中添加了BackgroundWorker組件,該組件在多線程編程方面使用起來非常方便,然而在開始時由於沒有搞清楚它的使用機制,走了不少的彎路,現在把我在使用它的過程中的經驗與諸位分享一下。
    BackgroundWorker類中主要用到的有這列屬性、方法和事件:
    重要屬性:
    1、CancellationPending             擷取一個值,指示應用程式是否已請求取消後台操作。通過在DoWork事件中判斷CancellationPending屬性可以認定是否需要取消後台操作(也就是結束線程);
    2、IsBusy                          擷取一個值,指示 BackgroundWorker 是否正在運行非同步作業。程式中使用IsBusy屬性用來確定後台操作是否正在使用中;
    3、WorkerReportsProgress           擷取或設定一個值,該值指示BackgroundWorker能否報告進度更新
    4、WorkerSupportsCancellation      擷取或設定一個值,該值指示 BackgroundWorker 是否支援非同步取消。設定WorkerSupportsCancellation為true使得程式可以調用CancelAsync方法提交終止掛起的後台操作的請求;
    重要方法:
    1、CancelAsync         請求取消掛起的後台操作
    2、RunWorkerAsync      開始執行後台操作
    3、ReportProgress      引發ProgressChanged事件  
    重要事件:
    1、DoWork              調用 RunWorkerAsync 時發生
    2、ProgressChanged     調用 ReportProgress 時發生
    3、RunWorkerCompleted  當後台操作已完成、被取消或引發異常時發生
    另外還有三個重要的參數是RunWorkerCompletedEventArgs以及DoWorkEventArgs、ProgressChangedEventArgs。
    BackgroundWorker的各屬性、方法、事件的調用機制和順序:

    從可見在整個生活周期內發生了3次重要的參數傳遞過程:
    參數傳遞1:此次的參數傳遞是將RunWorkerAsync(Object)中的Object傳遞到DoWork事件的DoWorkEventArgs.Argument,由於在這裡只有一個參數可以傳遞,所以在實際應用往封裝一個類,將整個執行個體化的類作為RunWorkerAsync的Object傳遞到DoWorkEventArgs.Argument;
    參數傳遞2:此次是將程式運行進度傳遞給ProgressChanged事件,實際使用中往往使用給方法和事件更新進度條或者日誌資訊;
    參數傳遞3:在DoWork事件結束之前,將後台線程產生的結果資料賦給DoWorkEventArgs.Result一邊在RunWorkerCompleted事件中調用RunWorkerCompletedEventArgs.Result屬性取得後台線程產生的結果。
    另外從可以看到DoWork事件是在後台線程中啟動並執行,所以在該事件中不能夠操作使用者介面的內容,如果需要更新使用者介面,可以使用ProgressChanged事件及RunWorkCompleted事件來實現。

   

 

我也再來補充下:上面3個函數,除了DoWork不能直接操作UI控制項外(自己寫委託可以或者設定check),其餘的方法內都可以直接操作控制項。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.