最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#使用BackgroundWorker控件

 更新時(shí)間:2022年02月24日 11:26:32   作者:.NET開發(fā)菜鳥  
這篇文章介紹了C#使用BackgroundWorker控件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

在我們的程序中,經(jīng)常會(huì)有一些耗時(shí)較長(zhǎng)的運(yùn)算,為了保證用戶體驗(yàn),不引起界面不響應(yīng),我們一般會(huì)采用多線程操作,讓耗時(shí)操作在后臺(tái)完成,完成后再進(jìn)行處理或給出提示,在運(yùn)行中,也會(huì)時(shí)時(shí)去刷新界面上的進(jìn)度條等顯示,必要時(shí)還要控制后臺(tái)線程中斷當(dāng)前操作。

在.net中,提供了一個(gè)組件BackgroundWorker就是專門解決這個(gè)問(wèn)題的。BackgroundWorker類允許在單獨(dú)的專用線程上運(yùn)行操作。 耗時(shí)的操作(如下載和數(shù)據(jù)庫(kù)事務(wù))在長(zhǎng)時(shí)間運(yùn)行時(shí)可能會(huì)導(dǎo)致用戶界面(UI)似乎處于停止響應(yīng)狀態(tài)。如果需要能進(jìn)行響應(yīng)的用戶界面,而且面臨與這類操作相關(guān)的長(zhǎng)時(shí)間延遲,則可以使用BackgroundWorker類方便地解決問(wèn)題。

程序執(zhí)行步驟:

  • 1、調(diào)用BackgroundWorker的RunWorkerAsync()方法,如果后臺(tái)操作需要參數(shù),在調(diào)用RunWorkerAsync()方法時(shí)給出參數(shù),在DoWork事件處理程序內(nèi)部,可以從DoWorkEventArgs.Argument屬性中提取該參數(shù)。
  • 2、執(zhí)行DoWork事件,后臺(tái)需要執(zhí)行的代碼放到DoWork事件里面執(zhí)行。當(dāng)調(diào)用RunWorkerAsync()方法時(shí),BackgroundWorker通過(guò)觸發(fā)DoWork事件,開始執(zhí)行后臺(tái)操作

顯示后臺(tái)操作進(jìn)度:

為了顯示后臺(tái)操作的執(zhí)行進(jìn)度,首先要使WorkerReportsProgress等于true,然后調(diào)用BackgroundWorker的ReportProgress()方法,通過(guò)它傳遞操作完成的進(jìn)度值,此外,該方法觸發(fā)ProgressChanged事件,在此事件中,通過(guò)ProgressChangedEventArgs的實(shí)例,接收到主線程傳遞過(guò)來(lái)的參數(shù)。

取消后臺(tái)操作:

為了使 BackgroundWorker 可以取消后臺(tái)正在執(zhí)行的操作,首先要把屬性WorkerSupportsCancellation 的值設(shè)置為 true。接著調(diào)用CancelAsync()方法,該方法使得屬性CancellationPending 為true,利用CancellationPending 屬性,可以判斷是否取消后臺(tái)異步操作。

后臺(tái)操作完成后,反饋給用戶:

當(dāng)后臺(tái)操作完成以后,無(wú)論是completed 還是cancelled,RunWorkerCompleted()事件都會(huì)被觸發(fā),通過(guò)此方法可以將后臺(tái)操作的完成結(jié)果反饋給用戶。RunWorkerCompleted 事件處理函數(shù)會(huì)在DoWork 事件處理函數(shù)返回后被調(diào)用。通過(guò)它我們可以進(jìn)行一些運(yùn)算結(jié)束后的操作,比如禁用取消按鈕,異常處理,結(jié)果顯示等。注意,如果想要拿到e.Result,您需要在BGWorker_DoWork方法中設(shè)置 e.Result屬性另外,通過(guò)RunWorkerCompletedEventArgs實(shí)例的Cancelled 屬性,以判斷是否是Cancel操作使得后臺(tái)操作終止;

從后臺(tái)操作返回值

在執(zhí)行DoWork事件時(shí)DoWorkEventArgs實(shí)例的Result屬性,返回值到用戶;在RunWorkerCompleted事件里,RunWorkerCompletedEventArgs 實(shí)例的Result屬性接收值;

創(chuàng)建BackgroundWorkerDemo例子:

  • 1.新建一個(gè)windows窗體應(yīng)用程序,如:BackgroundWorkerDemo
  • 2.拖一個(gè)ProgressBar(進(jìn)度條)和一個(gè)BackgroundWorker控件到Form窗體上,界面如圖:

后臺(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.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Threading;

namespace BackgroundWorkerDemo
{
    public partial class FrmDemo : Form
    {
        //設(shè)置生成臨時(shí)文件的路徑
        static string strSaveDir = @"F:\培訓(xùn)";
        public FrmDemo()
        {
            InitializeComponent();

            //顯示后臺(tái)操作的執(zhí)行進(jìn)度
            this.bgWork.WorkerReportsProgress = true;
            //可以取消后臺(tái)正在執(zhí)行的操作
            this.bgWork.WorkerSupportsCancellation = true;
        }

        /// <summary>
        /// 開始
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Start_Click(object sender, EventArgs e)
        {
            if (Directory.Exists(strSaveDir) == false)
            {
                return;
            }
            btn_Start.Enabled = false;
            int count = Convert.ToInt32(this.txt_File.Text.ToString().Trim());
            //設(shè)置進(jìn)度條
            this.proBar.Minimum = 0;
            this.proBar.Maximum = count;
            this.proBar.Value = this.proBar.Minimum;
            //開始執(zhí)行異步線程,進(jìn)行后臺(tái)操作,給后臺(tái)傳遞參數(shù)
            this.bgWork.RunWorkerAsync(count);
        }

        /// <summary>
        /// 后臺(tái)操作要處理的任務(wù)代碼
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void bgWork_DoWork(object sender, DoWorkEventArgs e)
        {
            //獲取從RunWorkerAsync()方法里面?zhèn)鬟f的參數(shù)的值
            int fileCount= Convert.ToInt32(e.Argument);
            Random rand = new Random();
            byte[] buffer = new byte[2048];
            for (int i = 0; i < fileCount; i++)
            {
                try
                {
                    string strFileName = Path.Combine(strSaveDir, i.ToString() + ".tmp");
                    using (var stream = File.Create(strFileName))
                    {
                        int n = 0;
                        int maxByte = 8 * 1024 * 1024;
                        while (n < maxByte)
                        {
                            rand.NextBytes(buffer);
                            stream.Write(buffer, 0, buffer.Length);
                            n += buffer.Length;
                        }
                    }
                }
                catch (Exception ex)
                {
                    continue;
                }
                finally
                {
                    //報(bào)告進(jìn)度
                    this.bgWork.ReportProgress(i + 1);
                    Thread.Sleep(100);
                }

                //判斷是否取消了后臺(tái)操作
                if (bgWork.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }

                //設(shè)置返回值
                e.Result = 234;
            }
        }

        /// <summary>
        /// 更新前臺(tái)界面進(jìn)度條
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void bgWork_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            //獲取異步任務(wù)的進(jìn)度百分百
            int val = e.ProgressPercentage;
            this.label2.Text = string.Format("已經(jīng)生成{0}個(gè)文件", val);
            //進(jìn)度條顯示當(dāng)前進(jìn)度
            this.proBar.Value = val;
        }

        /// <summary>
        /// 后臺(tái)操作完成,向前臺(tái)反饋信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void bgWork_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            btn_Start.Enabled = true;
            //用戶取消操作(e.Cancelled==true,表示異步操作已被取消)
            if (e.Cancelled)
            {
                MessageBox.Show("用戶取消后臺(tái)操作", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show("操作完成", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

                //接收返回值
                int result = (int)e.Result;

                MessageBox.Show("返回值:" + result);
            }
        }

        /// <summary>
        /// 取消
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Cancle_Click(object sender, EventArgs e)
        {
            //調(diào)用CancelAsync(),取消掛起的后臺(tái)操作
            this.bgWork.CancelAsync();
        }
    }
}

運(yùn)行界面:

操作完成界面:

接收返回值:

取消后臺(tái)操作:

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

相關(guān)文章

  • c# Winform 程序自動(dòng)更新實(shí)現(xiàn)方法

    c# Winform 程序自動(dòng)更新實(shí)現(xiàn)方法

    Winform程序自動(dòng)更新我也是第一次做,網(wǎng)上找了自動(dòng)更新的源碼,后來(lái)又根據(jù)在網(wǎng)上看到的一些方法,自己試了很久,最終還是有寫錯(cuò)誤,所以花了錢讓別人幫忙調(diào)試成功的,下面是我自己搗騰出來(lái)的,方便大家借鑒,如果有什么錯(cuò)誤的地方歡迎指正
    2017-02-02
  • Unity UGUI的EventTrigger事件監(jiān)聽器組件介紹使用示例

    Unity UGUI的EventTrigger事件監(jiān)聽器組件介紹使用示例

    這篇文章主要為大家介紹了Unity UGUI的EventTrigger事件監(jiān)聽器組件介紹及使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 淺談C#中的Infinity和NaN

    淺談C#中的Infinity和NaN

    下面小編就為大家?guī)?lái)一篇淺談C#中的Infinity和NaN。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • unity3d調(diào)用手機(jī)或電腦攝像頭

    unity3d調(diào)用手機(jī)或電腦攝像頭

    這個(gè)是在網(wǎng)上看到的,經(jīng)測(cè)試可以在電腦上運(yùn)行,確實(shí)調(diào)用了本地?cái)z像頭。有需要的小伙伴可以參考下。
    2015-03-03
  • winform關(guān)閉窗體FormClosing事件用法介紹

    winform關(guān)閉窗體FormClosing事件用法介紹

    這篇文章介紹了winform關(guān)閉窗體FormClosing事件的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • C#使用ZXing實(shí)現(xiàn)二維碼和條形碼的生成

    C#使用ZXing實(shí)現(xiàn)二維碼和條形碼的生成

    這篇文章主要為大家詳細(xì)介紹了C#如何使用ZXing實(shí)現(xiàn)二維碼和條形碼的生成與識(shí)別,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • WPF開發(fā)txt閱讀器實(shí)現(xiàn)目錄提取功能

    WPF開發(fā)txt閱讀器實(shí)現(xiàn)目錄提取功能

    這篇文章主要為大家詳細(xì)介紹了WPF開發(fā)txt閱讀器時(shí)如何實(shí)現(xiàn)目錄提取功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • selenium.chrome寫擴(kuò)展攔截或轉(zhuǎn)發(fā)請(qǐng)求功能

    selenium.chrome寫擴(kuò)展攔截或轉(zhuǎn)發(fā)請(qǐng)求功能

    Selenium?WebDriver?是一組開源?API,用于自動(dòng)測(cè)試?Web?應(yīng)用程序,利用它可以通過(guò)代碼來(lái)控制chrome瀏覽器,今天通過(guò)本文給大家介紹selenium?chrome寫擴(kuò)展攔截或轉(zhuǎn)發(fā)請(qǐng)求功能,感興趣的朋友一起看看吧
    2022-07-07
  • c#唯一值渲染實(shí)例代碼

    c#唯一值渲染實(shí)例代碼

    這篇文章主要介紹了c#唯一值渲染實(shí)例代碼,有需要的朋友可以參考一下
    2013-12-12
  • C#導(dǎo)出網(wǎng)站功能實(shí)例代碼講解

    C#導(dǎo)出網(wǎng)站功能實(shí)例代碼講解

    這篇文章主要介紹了C#導(dǎo)出網(wǎng)站功能實(shí)例代碼,需要的朋友可以參考下
    2015-10-10

最新評(píng)論

玉门市| 鸡泽县| 邳州市| 大丰市| 武邑县| 邹平县| 从江县| 清丰县| 沙田区| 清水河县| 钦州市| 满城县| 柘城县| 肃宁县| 东光县| 永济市| 图们市| 长春市| 莆田市| 安达市| 宾阳县| 德庆县| 都江堰市| 略阳县| 铜川市| 黎平县| 马公市| 香河县| 朝阳区| 盐池县| 酉阳| 宣汉县| 五家渠市| 宣汉县| 余姚市| 城固县| 四会市| 安顺市| 西乡县| 友谊县| 东海县|