網站首頁 編程語言 正文
查詢了一下MSDN文檔,其中微軟就BackgroundWorker類的功能有這么一個描述(英文的,根據個人理解翻譯):BackgroundWorker類允許您在單獨的線程上執行某個可能導致用戶界面(UI)停止響應的耗時操作(比如文件下載數據庫事務等),并且想要一個響應式的UI來反應當前耗時操作的進度。?
可以看的出來,BackgroundWorker組件提供了一種執行異步操作(后臺線程)的同時,并且還能妥妥的顯示操作進度的解決方案。于是乎,我便深入的了解了一下BackgroundWorker類。針對BackgroundWorker類的部分重要屬性和方法進行了一次總結。?
1、屬性:
WorkerReportsProgress?
bool類型,指示BackgroundWorker是否可以報告進度更新。當該屬性值為True是,將可以成功調用ReportProgress方法,否則將引發InvalidOperationException異常。 用法:
private BackgroundWorker bgWorker = new BackgroundWorker(); bgWorker.WorkerReportsProgress = true;
WorkerSupportsCancellation?
bool類型,指示BackgroundWorker是否支持異步取消操作。當該屬性值為True是,將可以成功調用CancelAsync方法,否則將引發InvalidOperationException異常。 用法:
bgWorker.WorkerSupportsCancellation = true;
CancellationPending?
bool類型,指示應用程序是否已請求取消后臺操作。此屬性通常放在用戶執行的異步操作內部,用來判斷用戶是否取消執行異步操作。當執行BackgroundWorker.CancelAsync()方法時,該屬性值將變為True。 用法:
//在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是否正在執行一個異步操作。此屬性通常放在BackgroundWorker.RunWorkerAsync()方法之前,避免多次調用RunWorkerAsync()方法引發異常。當執行BackgroundWorker.RunWorkerAsync()方法是,該屬性值將變為True。
//防止重復執行異步操作引發錯誤 if (bgWorker.IsBusy) return; bgWorker.RunWorkerAsync();
2、方法:
RunWorkerAsync()?
開始執行一個后臺操作。調用該方法后,將觸發BackgroundWorker.DoWork事件,并以異步的方式執行DoWork事件中的代碼。?
該方法還有一個帶參數的重載方法:RunWorkerAsync(Object)。該方法允許傳遞一個Object類型的參數到后臺操作中,并且可以通過DoWork事件的DoWorkEventArgs.Argument屬性將該參數提取出來。?
注:當BackgroundWorker的IsBusy屬性為True時,調用該方法將引發InvalidOperationException異常。
//在啟動異步操作的地方鍵入代碼 bgWorker.RunWorkerAsync("hello");
ReportProgress(Int percentProgress)?
報告操作進度。調用該方法后,將觸發BackgroundWorker. ProgressChanged事件。另外,該方法包含了一個int類型的參數percentProgress,用來表示當前異步操作所執行的進度百分比。?
該方法還有一個重載方法:ReportProgress(Int percentProgress,?Object userState)。允許傳遞一個Object類型的狀態對象到 ProgressChanged事件中,并且可以通過ProgressChanged事件的ProgressChangedEventArgs.UserState屬性取得參數值。?
注:調用該方法之前需確保WorkerReportsProgress屬性值為True,否則將引發InvalidOperationException異常。?
用法:
for (int i = 0; i <= 100; i++) { //向ProgressChanged報告進度 bgWorker.ReportProgress(i,"Working"); System.Threading.Thread.Sleep(10); }
CancelAsync()?
請求取消當前正在執行的異步操作。調用該方法將使BackgroundWorker.CancellationPending屬性設置為True。?
但需要注意的是,并非每次調用CancelAsync()都能確保異步操作,CancelAsync()通常不適用于取消一個緊密執行的操作,更適用于在循環體中執行。?
用法:
//在需要執行取消操作的地方鍵入以下代碼 bgWorker.CancelAsync();
3、事件:
DoWork
用于承載異步操作。當調用BackgroundWorker.RunWorkerAsync()時觸發。?
需要注意的是,由于DoWork事件內部的代碼運行在非UI線程之上,所以在DoWork事件內部應避免于用戶界面交互,而于用戶界面交互的操作應放置在ProgressChanged和RunWorkerCompleted事件中。
ProgressChanged
當調用BackgroundWorker.ReportProgress(int percentProgress)方式時觸發該事件。?
該事件的ProgressChangedEventArgs.ProgressPercentage屬性可以接收來自ReportProgress方法傳遞的percentProgress參數值,ProgressChangedEventArgs.UserState屬性可以接收來自ReportProgress方法傳遞的userState參數。
RunWorkerCompleted
異步操作完成或取消時執行的操作,當調用DoWork事件執行完成時觸發。?
該事件的RunWorkerCompletedEventArgs參數包含三個常用的屬性Error,Cancelled,Result。其中,Error表示在執行異步操作期間發生的錯誤;Cancelled用于判斷用戶是否取消了異步操作;Result屬性接收來自DoWork事件的DoWorkEventArgs參數的Result屬性值,可用于傳遞異步操作的執行結果。
4、附源代碼:
前臺
后臺
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 = "處理進度:" + 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(); } } }
運行結果:
原文鏈接:https://www.cnblogs.com/zhaoshujie/p/9634136.html
相關推薦
- 2023-05-15 GoLang中的加密方法小結_Golang
- 2022-05-20 Modscan和Modsim 兩種Modbus調試工具使用說明
- 2022-11-17 Go語言學習教程之指針的示例詳解_Golang
- 2022-05-21 Nginx實現會話保持的兩種方式_nginx
- 2022-05-05 Redis數據類型string和Hash詳解_Redis
- 2022-11-09 關于Rust編譯時報link.exe?not?found錯誤問題_相關技巧
- 2022-09-29 ASP.NET?MVC實現多選下拉框保存并顯示_實用技巧
- 2022-12-24 Python中requirements.txt簡介(推薦)_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支