亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C# BackgroundWorker使用教程

 更新時間:2018年09月20日 10:26:14   作者:五維思考  
這篇文章主要為大家詳細介紹了C# BackgroundWorker使用教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下

查詢了一下MSDN文檔,其中微軟就BackgroundWorker類的功能有這么一個描述(英文的,根據(jù)個人理解翻譯):BackgroundWorker類允許您在單獨的線程上執(zhí)行某個可能導致用戶界面(UI)停止響應的耗時操作(比如文件下載數(shù)據(jù)庫事務等),并且想要一個響應式的UI來反應當前耗時操作的進度。

可以看的出來,BackgroundWorker組件提供了一種執(zhí)行異步操作(后臺線程)的同時,并且還能妥妥的顯示操作進度的解決方案。于是乎,我便深入的了解了一下BackgroundWorker類。針對BackgroundWorker類的部分重要屬性和方法進行了一次總結。

1、屬性:

WorkerReportsProgress

bool類型,指示BackgroundWorker是否可以報告進度更新。當該屬性值為True是,將可以成功調(diào)用ReportProgress方法,否則將引發(fā)InvalidOperationException異常。 用法:

private BackgroundWorker bgWorker = new BackgroundWorker();
bgWorker.WorkerReportsProgress = true;

WorkerSupportsCancellation

bool類型,指示BackgroundWorker是否支持異步取消操作。當該屬性值為True是,將可以成功調(diào)用CancelAsync方法,否則將引發(fā)InvalidOperationException異常。 用法:

bgWorker.WorkerSupportsCancellation = true;

CancellationPending

bool類型,指示應用程序是否已請求取消后臺操作。此屬性通常放在用戶執(zhí)行的異步操作內(nèi)部,用來判斷用戶是否取消執(zhí)行異步操作。當執(zhí)行BackgroundWorker.CancelAsync()方法時,該屬性值將變?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í)行一個異步操作。此屬性通常放在BackgroundWorker.RunWorkerAsync()方法之前,避免多次調(diào)用RunWorkerAsync()方法引發(fā)異常。當執(zhí)行BackgroundWorker.RunWorkerAsync()方法是,該屬性值將變?yōu)門rue。

//防止重復執(zhí)行異步操作引發(fā)錯誤
if (bgWorker.IsBusy)
 return;
bgWorker.RunWorkerAsync();

2、方法:

RunWorkerAsync()

開始執(zhí)行一個后臺操作。調(diào)用該方法后,將觸發(fā)BackgroundWorker.DoWork事件,并以異步的方式執(zhí)行DoWork事件中的代碼。

該方法還有一個帶參數(shù)的重載方法:RunWorkerAsync(Object)。該方法允許傳遞一個Object類型的參數(shù)到后臺操作中,并且可以通過DoWork事件的DoWorkEventArgs.Argument屬性將該參數(shù)提取出來。
注:當BackgroundWorker的IsBusy屬性為True時,調(diào)用該方法將引發(fā)InvalidOperationException異常。

//在啟動異步操作的地方鍵入代碼
bgWorker.RunWorkerAsync("hello");

ReportProgress(Int percentProgress)

報告操作進度。調(diào)用該方法后,將觸發(fā)BackgroundWorker. ProgressChanged事件。另外,該方法包含了一個int類型的參數(shù)percentProgress,用來表示當前異步操作所執(zhí)行的進度百分比。

該方法還有一個重載方法:ReportProgress(Int percentProgress, Object userState)。允許傳遞一個Object類型的狀態(tài)對象到 ProgressChanged事件中,并且可以通過ProgressChanged事件的ProgressChangedEventArgs.UserState屬性取得參數(shù)值。

注:調(diào)用該方法之前需確保WorkerReportsProgress屬性值為True,否則將引發(fā)InvalidOperationException異常。
用法:

for (int i = 0; i <= 100; i++)
{
 //向ProgressChanged報告進度
 bgWorker.ReportProgress(i,"Working");
 System.Threading.Thread.Sleep(10);
}

CancelAsync()

請求取消當前正在執(zhí)行的異步操作。調(diào)用該方法將使BackgroundWorker.CancellationPending屬性設置為True。
但需要注意的是,并非每次調(diào)用CancelAsync()都能確保異步操作,CancelAsync()通常不適用于取消一個緊密執(zhí)行的操作,更適用于在循環(huán)體中執(zhí)行。

用法:

//在需要執(zhí)行取消操作的地方鍵入以下代碼
bgWorker.CancelAsync(); 

3、事件:

DoWork

用于承載異步操作。當調(diào)用BackgroundWorker.RunWorkerAsync()時觸發(fā)。
需要注意的是,由于DoWork事件內(nèi)部的代碼運行在非UI線程之上,所以在DoWork事件內(nèi)部應避免于用戶界面交互,而于用戶界面交互的操作應放置在ProgressChanged和RunWorkerCompleted事件中。

ProgressChanged

當調(diào)用BackgroundWorker.ReportProgress(int percentProgress)方式時觸發(fā)該事件。
該事件的ProgressChangedEventArgs.ProgressPercentage屬性可以接收來自ReportProgress方法傳遞的percentProgress參數(shù)值,ProgressChangedEventArgs.UserState屬性可以接收來自ReportProgress方法傳遞的userState參數(shù)。

RunWorkerCompleted

異步操作完成或取消時執(zhí)行的操作,當調(diào)用DoWork事件執(zhí)行完成時觸發(fā)。
該事件的RunWorkerCompletedEventArgs參數(shù)包含三個常用的屬性Error,Cancelled,Result。其中,Error表示在執(zhí)行異步操作期間發(fā)生的錯誤;Cancelled用于判斷用戶是否取消了異步操作;Result屬性接收來自DoWork事件的DoWorkEventArgs參數(shù)的Result屬性值,可用于傳遞異步操作的執(zhí)行結果。

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();
 }
 }
}


運行結果:

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Unity工具類之生成文本驗證碼

    Unity工具類之生成文本驗證碼

    這篇文章主要為大家詳細介紹了Unity工具類之生成文本驗證碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • 淺談C#9.0新特性之參數(shù)非空檢查簡化

    淺談C#9.0新特性之參數(shù)非空檢查簡化

    這篇文章主要介紹了淺談C#9.0新特性之參數(shù)非空檢查簡化,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • C#面向?qū)ο缶幊讨幸蕾嚪崔D(zhuǎn)原則的示例詳解

    C#面向?qū)ο缶幊讨幸蕾嚪崔D(zhuǎn)原則的示例詳解

    在面向?qū)ο缶幊讨?,SOLID?是五個設計原則的首字母縮寫,旨在使軟件設計更易于理解、靈活和可維護。本文將通過實例詳細講講C#面向?qū)ο缶幊讨幸蕾嚪崔D(zhuǎn)原則,需要的可以參考一下
    2022-07-07
  • C# 如何解析獲取Url參數(shù)值

    C# 如何解析獲取Url參數(shù)值

    這篇文章主要介紹了C# 如何解析獲取Url參數(shù)值,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-08-08
  • C#折半插入排序算法實現(xiàn)方法

    C#折半插入排序算法實現(xiàn)方法

    這篇文章主要介紹了C#折半插入排序算法實現(xiàn)方法,實例分析了C#排序的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • 配置C#的系統(tǒng)環(huán)境變量的方法

    配置C#的系統(tǒng)環(huán)境變量的方法

    配置C#的系統(tǒng)環(huán)境變量的方法...
    2007-03-03
  • C#隨機生成Unicode類型字符串

    C#隨機生成Unicode類型字符串

    做測試時經(jīng)常需要生成一些隨機數(shù)據(jù),最常見的就是生成隨機字符串。而且往往要生成Unicode字符串,有時還要特別指定生成的字符的語言范圍。下面是我覺得比較靈活的方法:
    2013-04-04
  • 深入了解c# 設計模式之簡單工廠模式

    深入了解c# 設計模式之簡單工廠模式

    這篇文章主要介紹了c# 設計模式之簡單工廠模式的的相關資料,文中代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-06-06
  • C#實現(xiàn)XML文件讀取

    C#實現(xiàn)XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現(xiàn)XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • C#實現(xiàn)位圖轉(zhuǎn)換成圖標的方法

    C#實現(xiàn)位圖轉(zhuǎn)換成圖標的方法

    這篇文章主要介紹了C#實現(xiàn)位圖轉(zhuǎn)換成圖標的方法,可實現(xiàn)將bmp格式位圖轉(zhuǎn)換成ico格式圖標的功能,需要的朋友可以參考下
    2015-06-06

最新評論