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
}
}
}
}
參考文獻