.NET-BackgroundWorker实现异步处理和滚动条报告进度Demo

基本API介绍 先创建一个BackgroundWorker

var worker= new BackgroundWorker
            {
                WorkerReportsProgress = true,
                WorkerSupportsCancellation = true,
            };
搭载事件处理程序:
worker.DoWork += BackgroundWorker_DoWork;
BackgroundWorker_DoWork触发的条件:调用 BackgroundWorker.RunWorkerAsync() 时发生
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            _process = 0;         
            _doWorkEventArgs = e;
            switch (Status)
            {
                case -1: //错误
                    {
                        //TODO:在此添加对于异常错误的处理代码

                    }
                    break;
                case 0: //空闲
                    {
                        Status = 1;
                        //RunService();

                        try
                        {
                            DoMyTask();
                        }
                        catch (Exception ex)
                        {  
                            LogService.WriteErrorLog(ex, "CAXA.MES.ServerBusinessService");
                            throw ex;
                            Status = -1;
                        }
                        finally
                        {
                            GC.Collect();
                            //强制在此对所有代进行垃圾回收,释放系统资源,防止数据量过大导致程序不稳定
                            Status = 0;
                        }
                    }
                    break;
                case 1: //正在运行
                    {
                        //TODO:在此添加程序正在运行时,在此运行时处理代码
                        Status = 3;
                    }
                    break;
                case 2: //等待
                    {
                        //TODO:在此添加程序等待处理代码
                        Status = 3;
                    }
                    break;
                case 3: //正在取消
                    {
                        //TODO:在此添加程序取消处理代码
                        Status = 3;
                    }
                    break;
                default: //未知
                    {
                        //TODO:在此添加未知异常信息处理代码
                        Status = Int32.MaxValue;
                    }
                    break;
            }

        }
触发以上方法的调用方式:
if (!worker.IsBusy)
     worker.RunWorkerAsync();
取消挂起的后台操作方法:
 if (worker.IsBusy)
     worker.CancelAsync();
再注册两个报告进度的事件:
//BackgroundWorker.ReportProgress(System.Int32) 时发生
worker.ProgressChanged += progressChanged;
//当后台操作已完成、被取消或引发异常时发生
worker.RunWorkerCompleted += runWorkerCompleted;

Demo

    /// <summary>
    /// Asyn
    /// </summary>
    public class Asyn
    {
        #region 构造函数

        public Asyn()
        {
            Worker = new BackgroundWorker
            {
                WorkerReportsProgress = true,
                WorkerSupportsCancellation = true,
            };
            Worker.DoWork +=worker_DoWork;
        }

        #endregion

        #region 属性字段
        public BackgroundWorker Worker { get; private set; }

        public const  int LoopCount = 100;
        public static  int CurProcessVal = 0;
        #endregion

        #region 私有方法

        private void worker_DoWork(object sender, DoWorkEventArgs e)
        {

            while (CurProcessVal++ < LoopCount)
            {
                if (Worker.CancellationPending) //如果执行停止操作变为true
                {
                    e.Cancel = true;
                    break;
                }  
                Thread.Sleep(100);
                Worker.ReportProgress(CurProcessVal);
            }
        }
        #endregion

        #region 公有方法

        public void Start()
        {
            if (!Worker.IsBusy)
                Worker.RunWorkerAsync();
        }

        public void Stop()
        {
            if (Worker.IsBusy)
            {
                Worker.CancelAsync();
            }
        }

        #endregion

    }

调用:

    public partial class Form1 : Form
    {
        private Asyn _asyn;
        public Form1()
        {
            InitializeComponent();

            _asyn = new Asyn();
            _asyn.Worker.ProgressChanged += worker_ProgressChanged;
            _asyn.Worker.RunWorkerCompleted += worker_RunWorkerCompleted;
            bar.Maximum = Asyn.LoopCount;
        }

        private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            bar.ProgressBar.Invoke(new Action(() => bar.Value = e.ProgressPercentage));
            statusLabel.Text = string.Format("正在处理...({0}/{1})", e.ProgressPercentage, Asyn.LoopCount);
        }

        private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            bar.ProgressBar.Invoke(new Action(() => bar.Value = Asyn.LoopCount));
            if (e.Cancelled)
            {
                statusLabel.Text = "处理已停止";
                bar.ProgressBar.Invoke(new Action(() => bar.Value = Asyn.CurProcessVal));
            }
            else
            {
                statusLabel.Text = "处理完成";
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            _asyn.Start();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            _asyn.Stop();
        }

    }

结果预览:
这里写图片描述

源码下载:
http://download.csdn.net/detail/daigualu/9834563

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值