說實話,我就壓根不知道有這麼一個控制項。今天周末實在不想幹正事,開啟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),其餘的方法內都可以直接操作控制項。