C# BackgroundWorker使用教程
查詢了一下MSDN文檔,其中微軟就BackgroundWorker類的功能有這么一個(gè)描述(英文的,根據(jù)個(gè)人理解翻譯):BackgroundWorker類允許您在單獨(dú)的線程上執(zhí)行某個(gè)可能導(dǎo)致用戶界面(UI)停止響應(yīng)的耗時(shí)操作(比如文件下載數(shù)據(jù)庫事務(wù)等),并且想要一個(gè)響應(yīng)式的UI來反應(yīng)當(dāng)前耗時(shí)操作的進(jìn)度。
可以看的出來,BackgroundWorker組件提供了一種執(zhí)行異步操作(后臺(tái)線程)的同時(shí),并且還能妥妥的顯示操作進(jìn)度的解決方案。于是乎,我便深入的了解了一下BackgroundWorker類。針對(duì)BackgroundWorker類的部分重要屬性和方法進(jìn)行了一次總結(jié)。
1、屬性:
WorkerReportsProgress
bool類型,指示BackgroundWorker是否可以報(bào)告進(jìn)度更新。當(dāng)該屬性值為True是,將可以成功調(diào)用ReportProgress方法,否則將引發(fā)InvalidOperationException異常。 用法:
private BackgroundWorker bgWorker = new BackgroundWorker(); bgWorker.WorkerReportsProgress = true;
WorkerSupportsCancellation
bool類型,指示BackgroundWorker是否支持異步取消操作。當(dāng)該屬性值為True是,將可以成功調(diào)用CancelAsync方法,否則將引發(fā)InvalidOperationException異常。 用法:
bgWorker.WorkerSupportsCancellation = true;
CancellationPending
bool類型,指示應(yīng)用程序是否已請(qǐng)求取消后臺(tái)操作。此屬性通常放在用戶執(zhí)行的異步操作內(nèi)部,用來判斷用戶是否取消執(zhí)行異步操作。當(dāng)執(zhí)行BackgroundWorker.CancelAsync()方法時(shí),該屬性值將變?yōu)門rue。 用法:
//在DoWork中鍵入如下代碼
for (int i = 0; i <= 100; i++)
{
if (bgWorker.CancellationPending)
{
e.Cancel = true;
return;
}
else
{
bgWorker.ReportProgress(i,"Working");
System.Threading.Thread.Sleep(10);
}
}
IsBusy
bool類型,指示BackgroundWorker是否正在執(zhí)行一個(gè)異步操作。此屬性通常放在BackgroundWorker.RunWorkerAsync()方法之前,避免多次調(diào)用RunWorkerAsync()方法引發(fā)異常。當(dāng)執(zhí)行BackgroundWorker.RunWorkerAsync()方法是,該屬性值將變?yōu)門rue。
//防止重復(fù)執(zhí)行異步操作引發(fā)錯(cuò)誤 if (bgWorker.IsBusy) return; bgWorker.RunWorkerAsync();
2、方法:
RunWorkerAsync()
開始執(zhí)行一個(gè)后臺(tái)操作。調(diào)用該方法后,將觸發(fā)BackgroundWorker.DoWork事件,并以異步的方式執(zhí)行DoWork事件中的代碼。
該方法還有一個(gè)帶參數(shù)的重載方法:RunWorkerAsync(Object)。該方法允許傳遞一個(gè)Object類型的參數(shù)到后臺(tái)操作中,并且可以通過DoWork事件的DoWorkEventArgs.Argument屬性將該參數(shù)提取出來。
注:當(dāng)BackgroundWorker的IsBusy屬性為True時(shí),調(diào)用該方法將引發(fā)InvalidOperationException異常。
//在啟動(dòng)異步操作的地方鍵入代碼
bgWorker.RunWorkerAsync("hello");
ReportProgress(Int percentProgress)
報(bào)告操作進(jìn)度。調(diào)用該方法后,將觸發(fā)BackgroundWorker. ProgressChanged事件。另外,該方法包含了一個(gè)int類型的參數(shù)percentProgress,用來表示當(dāng)前異步操作所執(zhí)行的進(jìn)度百分比。
該方法還有一個(gè)重載方法:ReportProgress(Int percentProgress, Object userState)。允許傳遞一個(gè)Object類型的狀態(tài)對(duì)象到 ProgressChanged事件中,并且可以通過ProgressChanged事件的ProgressChangedEventArgs.UserState屬性取得參數(shù)值。
注:調(diào)用該方法之前需確保WorkerReportsProgress屬性值為True,否則將引發(fā)InvalidOperationException異常。
用法:
for (int i = 0; i <= 100; i++)
{
//向ProgressChanged報(bào)告進(jìn)度
bgWorker.ReportProgress(i,"Working");
System.Threading.Thread.Sleep(10);
}
CancelAsync()
請(qǐng)求取消當(dāng)前正在執(zhí)行的異步操作。調(diào)用該方法將使BackgroundWorker.CancellationPending屬性設(shè)置為True。
但需要注意的是,并非每次調(diào)用CancelAsync()都能確保異步操作,CancelAsync()通常不適用于取消一個(gè)緊密執(zhí)行的操作,更適用于在循環(huán)體中執(zhí)行。
用法:
//在需要執(zhí)行取消操作的地方鍵入以下代碼 bgWorker.CancelAsync();
3、事件:
DoWork
用于承載異步操作。當(dāng)調(diào)用BackgroundWorker.RunWorkerAsync()時(shí)觸發(fā)。
需要注意的是,由于DoWork事件內(nèi)部的代碼運(yùn)行在非UI線程之上,所以在DoWork事件內(nèi)部應(yīng)避免于用戶界面交互,而于用戶界面交互的操作應(yīng)放置在ProgressChanged和RunWorkerCompleted事件中。
ProgressChanged
當(dāng)調(diào)用BackgroundWorker.ReportProgress(int percentProgress)方式時(shí)觸發(fā)該事件。
該事件的ProgressChangedEventArgs.ProgressPercentage屬性可以接收來自ReportProgress方法傳遞的percentProgress參數(shù)值,ProgressChangedEventArgs.UserState屬性可以接收來自ReportProgress方法傳遞的userState參數(shù)。
RunWorkerCompleted
異步操作完成或取消時(shí)執(zhí)行的操作,當(dāng)調(diào)用DoWork事件執(zhí)行完成時(shí)觸發(fā)。
該事件的RunWorkerCompletedEventArgs參數(shù)包含三個(gè)常用的屬性Error,Cancelled,Result。其中,Error表示在執(zhí)行異步操作期間發(fā)生的錯(cuò)誤;Cancelled用于判斷用戶是否取消了異步操作;Result屬性接收來自DoWork事件的DoWorkEventArgs參數(shù)的Result屬性值,可用于傳遞異步操作的執(zhí)行結(jié)果。
4、附源代碼:
前臺(tái)

后臺(tái)
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 PrograssBar
{
public partial class PrograssBarUseBackgroundWorker : Form
{
private BackgroundWorker bgWorker = new BackgroundWorker();
public PrograssBarUseBackgroundWorker()
{
InitializeComponent();
InitializeBackgroundWorker();
}
private void InitializeBackgroundWorker()
{
bgWorker.WorkerReportsProgress = true;
bgWorker.WorkerSupportsCancellation = true;
bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgessChanged);
bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_WorkerCompleted);
}
private void btnStart_Click(object sender, EventArgs e)
{
if (bgWorker.IsBusy)
return;
this.progressBar1.Maximum = 100;
this.btnStart.Enabled = false;
this.btnStop.Enabled = true;
bgWorker.RunWorkerAsync("hello");
}
public void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 100; i++)
{
if (bgWorker.CancellationPending)
{
e.Cancel = true;
return;
}
else
{
bgWorker.ReportProgress(i,"Working");
System.Threading.Thread.Sleep(10);
}
}
}
public void bgWorker_ProgessChanged(object sender, ProgressChangedEventArgs e)
{
//string state = (string)e.UserState;//接收ReportProgress方法傳遞過來的userState
this.progressBar1.Value = e.ProgressPercentage;
this.label1.Text = "處理進(jìn)度:" + Convert.ToString(e.ProgressPercentage) + "%";
}
public void bgWorker_WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if(e.Error!=null)
{
MessageBox.Show(e.Error.ToString());
return;
}
if (!e.Cancelled)
this.label1.Text = "處理完畢!";
else
this.label1.Text = "處理終止!";
}
private void btnStop_Click(object sender, EventArgs e)
{
this.btnStart.Enabled = true;
this.btnStop.Enabled = false;
bgWorker.CancelAsync();
}
}
}
運(yùn)行結(jié)果:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
淺談C#9.0新特性之參數(shù)非空檢查簡(jiǎn)化
這篇文章主要介紹了淺談C#9.0新特性之參數(shù)非空檢查簡(jiǎn)化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
C#面向?qū)ο缶幊讨幸蕾嚪崔D(zhuǎn)原則的示例詳解
在面向?qū)ο缶幊讨?,SOLID?是五個(gè)設(shè)計(jì)原則的首字母縮寫,旨在使軟件設(shè)計(jì)更易于理解、靈活和可維護(hù)。本文將通過實(shí)例詳細(xì)講講C#面向?qū)ο缶幊讨幸蕾嚪崔D(zhuǎn)原則,需要的可以參考一下2022-07-07
深入了解c# 設(shè)計(jì)模式之簡(jiǎn)單工廠模式
這篇文章主要介紹了c# 設(shè)計(jì)模式之簡(jiǎn)單工廠模式的的相關(guān)資料,文中代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06
C#實(shí)現(xiàn)位圖轉(zhuǎn)換成圖標(biāo)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)位圖轉(zhuǎn)換成圖標(biāo)的方法,可實(shí)現(xiàn)將bmp格式位圖轉(zhuǎn)換成ico格式圖標(biāo)的功能,需要的朋友可以參考下2015-06-06

