C# BackgroundWorker使用总结

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CSharper开发实例
{
    public partial class Frm_BackgroundWorker : Form
    {
        private BackgroundWorker bgWorke = new BackgroundWorker();
        public Frm_BackgroundWorker()
        {
            InitializeComponent();
            InitializeBackgroundWorker();
        }

        private void InitializeBackgroundWorker()
        {
            /*
            bool类型,指示BackgroundWorker是否可以报告进度更新。
            当该属性值为True是,将可以成功调用ReportProgress方法,否则将引发 
            InvalidOperationException异常。 用法:
            */
            bgWorke.WorkerReportsProgress = true;

            /*
            bool类型,指示BackgroundWorker是否支持异步取消操作。当该属性值为True是,将可以成功 
            调用CancelAsync方法,
            否则将引发InvalidOperationException异常。 用法:
            */
            bgWorke.WorkerSupportsCancellation = true;

            /*
            用于承载异步操作。当调用BackgroundWorker.RunWorkerAsync()时触发。 
            需要注意的是,由于DoWork事件内部的代码运行在非UI线程之上,所以在DoWork事件内部应避 
            免于用户界面交互,
            而于用户界面交互的操作应放置在ProgressChanged和RunWorkerCompleted事件中。
            */
            bgWorke.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
            //更新通知UI
            bgWorke.ProgressChanged += new 
            ProgressChangedEventHandler(bgWorker_ProgessChanged);

            /*
            异步操作完成或取消时执行的操作,当调用DoWork事件执行完成时触发。 
            该事件的RunWorkerCompletedEventArgs参数包含三个常用的属性 
            Error,Cancelled,Result。其中,Error表示在执行异步操作期间发生的错误;
            Cancelled用于判断用户是否取消了异步操作;Result属性接收来自DoWork事件的 
            DoWorkEventArgs参数的Result属性值,可用于传递异步操作的执行结果
            */
            bgWorke.RunWorkerCompleted += new 
            RunWorkerCompletedEventHandler(bgWorker_WorkerCompleted);
            //支持异步取消操作
            bgWorke.WorkerSupportsCancellation = true;
        }

        public void bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            for (int i = 0; i <= 100; i++)
            {
                //CancellationPending ch: bool类型指示应用程序是否已请求取消后台操作
                if (bgWorke.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }
                else
                {
                    /* 报告操作进度。调用该方法后,将触发BackgroundWorker.ProgressChanged事 
                      件。另外,该方法包含了一个int类型的参数percentProgress,
                      用来表示当前异步操作所执行的进度百分比。 该方法还有一个重载方法: 
                      ReportProgress(Int percentProgress, Object userState)。
                      允许传递一个Object类型的状态对象到 ProgressChanged事件中,并且可以通过 
                      ProgressChanged事件的ProgressChangedEventArgs.UserState属性取得参数 
                      值。
                       注:调用该方法之前需确保WorkerReportsProgress属性值为True,否则将引发 
                       InvalidOperationException异常。 
                       用法:*/
                    bgWorke.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 Btn_Stop_Click(object sender, EventArgs e)
        {
            this.Btn_Start.Enabled = true;
            this.Btn_Stop.Enabled = false;
           
            /*
            请求取消当前正在执行的异步操作。调用该方法将使BackgroundWorker.CancellationPending属性设置为True。 
            但需要注意的是,并非每次调用CancelAsync()都能确保异步操作,CancelAsync()通常不适用于取消一个紧密执行的操作,
            更适用于在循环体中执行。 
            */
            bgWorke.CancelAsync();
        }

        private void Btn_Start_Click(object sender, EventArgs e)
        {
            if (bgWorke.IsBusy)
                return;
            this.progressBar1.Maximum = 100;
            this.Btn_Start.Enabled = false;
            this.Btn_Stop.Enabled = true;

            /*
            开始执行一个后台操作。调用该方法后,将触发BackgroundWorker.DoWork事件,并以异步的方式执行DoWork事件中的代码。 
            该方法还有一个带参数的重载方法:RunWorkerAsync(Object)。该方法允许传递一个Object类型的参数到后台操作中,
            并且可以通过DoWork事件的DoWorkEventArgs.Argument属性将该参数提取出来。 
            注:当BackgroundWorker的IsBusy属性为True时,调用该方法将引发InvalidOperationException异常。
            */
            bgWorke.RunWorkerAsync("hello");
        }
    }
}

 


版权声明:本文为weixin_41424481原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。