欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中BackgroundWorker類(lèi)用法總結(jié)

 更新時(shí)間:2021年12月20日 11:22:07   作者:五維思考  
本文詳細(xì)講解了C#中BackgroundWorker類(lèi)用法總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

查詢(xún)了一下MSDN文檔,其中微軟就BackgroundWorker類(lèi)的功能有這么一個(gè)描述(英文的,根據(jù)個(gè)人理解翻譯):BackgroundWorker類(lèi)允許您在單獨(dú)的線程上執(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)線程)的同時(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線程之上,所以在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é)果:

到此這篇關(guān)于C#中BackgroundWorker類(lèi)用法總結(jié)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#讀寫(xiě)INI文件的方法

    C#讀寫(xiě)INI文件的方法

    這篇文章主要介紹了C#讀寫(xiě)INI文件的方法,涉及C#讀寫(xiě)ini文件的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • C#編寫(xiě)發(fā)送郵件組件

    C#編寫(xiě)發(fā)送郵件組件

    本文給大家分享的是使用C#編寫(xiě)的發(fā)送郵件的組件,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。
    2015-06-06
  • C# 在項(xiàng)目中引用x86 x64的非托管代碼的方法

    C# 在項(xiàng)目中引用x86 x64的非托管代碼的方法

    使用宏最簡(jiǎn)單的方法是編譯兩個(gè)版本,編譯多個(gè)版本可以點(diǎn)擊配置管理器,然后創(chuàng)建x86和x64,然后版本添加宏,這樣就可以判斷宏來(lái)使用不同的dll。這篇文章主要介紹了C# 在項(xiàng)目中引用x86 x64的非托管代碼的方法,需要的朋友可以參考下
    2018-03-03
  • 算法證明每一位都相同十進(jìn)制數(shù)不是完全平方數(shù)

    算法證明每一位都相同十進(jìn)制數(shù)不是完全平方數(shù)

    這篇文章主要為大家介紹了算法證明每一位都相同十進(jìn)制數(shù)不是完全平方數(shù)的過(guò)程論述,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • C# 設(shè)計(jì)模式系列教程-組合模式

    C# 設(shè)計(jì)模式系列教程-組合模式

    組合模式可以使客戶(hù)端調(diào)用簡(jiǎn)單,它可以一致使用組合結(jié)構(gòu)或是其中單個(gè)對(duì)象,簡(jiǎn)化了客戶(hù)端代碼。
    2016-06-06
  • 詳解c# 委托鏈

    詳解c# 委托鏈

    這篇文章主要介紹了c# 委托鏈的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C#實(shí)現(xiàn)最完整的文件和目錄操作類(lèi)實(shí)例

    C#實(shí)現(xiàn)最完整的文件和目錄操作類(lèi)實(shí)例

    這篇文章主要介紹了C#實(shí)現(xiàn)最完整的文件和目錄操作類(lèi),涉及C#針對(duì)文件與目錄的創(chuàng)建、獲取、檢測(cè)、刪除等常用操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-05-05
  • C# 格式化字符串的實(shí)現(xiàn)代碼

    C# 格式化字符串的實(shí)現(xiàn)代碼

    這篇文章主要介紹了C# 格式化字符串的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2016-11-11
  • 淺談Async和Await如何簡(jiǎn)化異步編程(幾個(gè)實(shí)例讓你徹底明白)

    淺談Async和Await如何簡(jiǎn)化異步編程(幾個(gè)實(shí)例讓你徹底明白)

    本篇文章主要介紹了淺談Async和Await如何簡(jiǎn)化異步編程,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • C#實(shí)現(xiàn)文件分割和合并的示例詳解

    C#實(shí)現(xiàn)文件分割和合并的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)文件分割和合并的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12

最新評(píng)論