基于事件的异步模式 关于BackgroundWorker类的使用

若要在后台执行耗时的操作,请创建一个 BackgroundWorker,侦听那些报告操作进度并在操作完成时发出信号的事件。

 

这里使用《C#高级编程》里面的一个例子说明这个类的使用:

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;
using System.Threading;

namespace EventAsync
{
    public partial class frmBackgroundWorker : Form
    {
        public frmBackgroundWorker()
        {
            InitializeComponent();
        }

        private void btnCal_Click(object sender, EventArgs e)
        {
            this.btnCal.Enabled = false;
            this.txtResult.Text = String.Empty;
            this.btnCancel.Enabled = true;
            this.prosbarCal.Value = 0;

            bgworkerCal.RunWorkerAsync(new CalcInput(int.Parse(this.txtX.Text), int.Parse(this.txtY.Text)));
        }

        private void OnDoWork(object sender, DoWorkEventArgs e)
        {
            CalcInput input = (CalcInput)e.Argument;

            for (int i = 0; i < 10; i++)
            {
                Thread.Sleep(5000);
                bgworkerCal.ReportProgress(i * 10);

                if (bgworkerCal.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }
            }
                
            e.Result = input.x + input.y;
        }

        private void OnWorkCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                this.txtResult.Text = "Cancelled";
            }
            else
            {
                this.txtResult.Text = e.Result.ToString(); 
            }            

            this.btnCal.Enabled = true;
            this.btnCancel.Enabled = false;
            this.prosbarCal.Value = 100;
        }        

        private void frmBackgroundWorker_Load(object sender, EventArgs e)
        {

        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            bgworkerCal.CancelAsync();
        }

        private void OnProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.prosbarCal.Value = e.ProgressPercentage;
        }
    }
}

在这里例子里:

加入一个backgroundworker类到windows form程序中

BackgroundWorker类有以下属性和方法

属性:

Name

GenerateMember: True 这个属性不常用

Modifiers Private 基本不用改

WorkerReportsProgress: 默认的是false,如果你在程序中要求backgroundworker类report progress进度,就需要把它设置为true. 在这个程序里,我们需要利用backgroundworker类向进度条回报进度,所以设置为true

WorkerSupportsCancellation: 默认是false 在这个程序里,我们需要启用取消功能,所以把它设置为true.

 

方法:

DoWork

ProgressChanged

RunWorkerCompleted

这三个方法结合示例说明。

在这里我们给backgroundworker类的三个方法分别指定

DoWork: OnDoWork

private void OnDoWork(object sender, DoWorkEventArgs e)
        {
            CalcInput input = (CalcInput)e.Argument;

            for (int i = 0; i < 10; i++)
            {
                Thread.Sleep(5000);
                bgworkerCal.ReportProgress(i * 10);

                if (bgworkerCal.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }
            }
                
            e.Result = input.x + input.y;
        }

看这段代码就知道了

DoWork 方法指的是backgroundworker类在运行过程中需要做的事情。对应的入口应该是

bgworkerCal.RunWorkerAsync(new CalcInput(int.Parse(this.txtX.Text), int.Parse(this.txtY.Text)));

也就是这样的顺序:

BackgroundWorker调用RunWorkerAsync方法------> 执行backgroundworker类的DoWork方法---------->进度更新的时候执行ProgressChanged方法----------------->进度完成或者取消时执行RunWorkerCompleted方法

 

在OnWork对应的事件OnDoWork里面, backgroundworker做以下工作:

a. 主要程序,比如读取数据什么的

b. 反馈进度 bgworkerCal.ReportProgress(i * 10);

c. 处理cancel. 如果在DoWork过程中,用户触发了bgworkerCal.CancelAsync()事件,做相应的处理

if (bgworkerCal.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }

CancellationPending属性指示是否backgroundworker类接收到了CancelAsync事件。

 

在ProgressChanged对应的事件OnProgressChanged里面,backgroundworker做以下工作:

a. 把进度反映到进度条上

 

在RunWorkerCompleted对应的OnWorkCompleted事件里,backgroundworker做以下工作:

a. 如果用户cancel了,显示相应结果

b. 如果用户没有cancel,显示成功运行结果

c. 进度设置为完成标志

 

其他的例子再慢慢分析了。

转载于:https://www.cnblogs.com/herbert/archive/2010/08/05/1793327.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值