C# BackgroundWorker使用教程
查詢(xún)了一下MSDN文檔,其中微軟就BackgroundWorker類(lèi)的功能有這么一個(gè)描述(英文的,根據(jù)個(gè)人理解翻譯):BackgroundWorker類(lèi)允許您在單獨(dú)的線(xiàn)程上執(zhí)行某個(gè)可能導(dǎo)致用戶(hù)界面(UI)停止響應(yīng)的耗時(shí)操作(比如文件下載數(shù)據(jù)庫(kù)事務(wù)等),并且想要一個(gè)響應(yīng)式的UI來(lái)反應(yīng)當(dāng)前耗時(shí)操作的進(jìn)度。
可以看的出來(lái),BackgroundWorker組件提供了一種執(zhí)行異步操作(后臺(tái)線(xiàn)程)的同時(shí),并且還能妥妥的顯示操作進(jìn)度的解決方案。于是乎,我便深入的了解了一下BackgroundWorker類(lèi)。針對(duì)BackgroundWorker類(lèi)的部分重要屬性和方法進(jìn)行了一次總結(jié)。
1、屬性:
WorkerReportsProgress
bool類(lèi)型,指示BackgroundWorker是否可以報(bào)告進(jìn)度更新。當(dāng)該屬性值為T(mén)rue是,將可以成功調(diào)用ReportProgress方法,否則將引發(fā)InvalidOperationException異常。 用法:
private BackgroundWorker bgWorker = new BackgroundWorker(); bgWorker.WorkerReportsProgress = true;
WorkerSupportsCancellation
bool類(lèi)型,指示BackgroundWorker是否支持異步取消操作。當(dāng)該屬性值為T(mén)rue是,將可以成功調(diào)用CancelAsync方法,否則將引發(fā)InvalidOperationException異常。 用法:
bgWorker.WorkerSupportsCancellation = true;
CancellationPending
bool類(lèi)型,指示應(yīng)用程序是否已請(qǐng)求取消后臺(tái)操作。此屬性通常放在用戶(hù)執(zhí)行的異步操作內(nèi)部,用來(lái)判斷用戶(hù)是否取消執(zhí)行異步操作。當(dāng)執(zhí)行BackgroundWorker.CancelAsync()方法時(shí),該屬性值將變?yōu)門(mén)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類(lèi)型,指示BackgroundWorker是否正在執(zhí)行一個(gè)異步操作。此屬性通常放在BackgroundWorker.RunWorkerAsync()方法之前,避免多次調(diào)用RunWorkerAsync()方法引發(fā)異常。當(dāng)執(zhí)行BackgroundWorker.RunWorkerAsync()方法是,該屬性值將變?yōu)門(mén)rue。
//防止重復(fù)執(zhí)行異步操作引發(fā)錯(cuò)誤 if (bgWorker.IsBusy) return; bgWorker.RunWorkerAsync();
2、方法:
RunWorkerAsync()
開(kāi)始執(zhí)行一個(gè)后臺(tái)操作。調(diào)用該方法后,將觸發(fā)BackgroundWorker.DoWork事件,并以異步的方式執(zhí)行DoWork事件中的代碼。
該方法還有一個(gè)帶參數(shù)的重載方法:RunWorkerAsync(Object)。該方法允許傳遞一個(gè)Object類(lèi)型的參數(shù)到后臺(tái)操作中,并且可以通過(guò)DoWork事件的DoWorkEventArgs.Argument屬性將該參數(shù)提取出來(lái)。
注:當(dāng)BackgroundWorker的IsBusy屬性為T(mén)rue時(shí),調(diào)用該方法將引發(fā)InvalidOperationException異常。
//在啟動(dòng)異步操作的地方鍵入代碼 bgWorker.RunWorkerAsync("hello");
ReportProgress(Int percentProgress)
報(bào)告操作進(jìn)度。調(diào)用該方法后,將觸發(fā)BackgroundWorker. ProgressChanged事件。另外,該方法包含了一個(gè)int類(lèi)型的參數(shù)percentProgress,用來(lái)表示當(dāng)前異步操作所執(zhí)行的進(jìn)度百分比。
該方法還有一個(gè)重載方法:ReportProgress(Int percentProgress, Object userState)。允許傳遞一個(gè)Object類(lèi)型的狀態(tài)對(duì)象到 ProgressChanged事件中,并且可以通過(guò)ProgressChanged事件的ProgressChangedEventArgs.UserState屬性取得參數(shù)值。
注:調(diào)用該方法之前需確保WorkerReportsProgress屬性值為T(mén)rue,否則將引發(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è)置為T(mén)rue。
但需要注意的是,并非每次調(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線(xiàn)程之上,所以在DoWork事件內(nèi)部應(yīng)避免于用戶(hù)界面交互,而于用戶(hù)界面交互的操作應(yīng)放置在ProgressChanged和RunWorkerCompleted事件中。
ProgressChanged
當(dāng)調(diào)用BackgroundWorker.ReportProgress(int percentProgress)方式時(shí)觸發(fā)該事件。
該事件的ProgressChangedEventArgs.ProgressPercentage屬性可以接收來(lái)自ReportProgress方法傳遞的percentProgress參數(shù)值,ProgressChangedEventArgs.UserState屬性可以接收來(lái)自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用于判斷用戶(hù)是否取消了異步操作;Result屬性接收來(lái)自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方法傳遞過(guò)來(lái)的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í)有所幫助,也希望大家多多支持我們。
您可能感興趣的文章
- 01-10C#使用Dispose模式實(shí)現(xiàn)手動(dòng)對(duì)資源的釋放
- 01-10C#3.0使用EventLog類(lèi)寫(xiě)Windows事件日志的方法
- 01-10C#使用windows服務(wù)開(kāi)啟應(yīng)用程序的方法
- 01-10c# ArrayList的使用方法小總結(jié)
- 01-10C#使用ADO.Net部件來(lái)訪問(wèn)Access數(shù)據(jù)庫(kù)的方法
- 01-10C#使用Mutex簡(jiǎn)單實(shí)現(xiàn)程序單實(shí)例運(yùn)行的方法
- 01-10使用Nopcommerce為商城添加滿(mǎn)XX減XX優(yōu)惠券功能
- 01-10C#中yield用法使用說(shuō)明
- 01-10C#編程和Visual Studio使用技巧(下)
- 01-10C#編程和Visual Studio使用技巧(上)


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開(kāi)的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線(xiàn)程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過(guò)重寫(xiě)Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法