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

来源:互联网 发布:sql语句在哪里输入 编辑:程序博客网 时间:2024/06/06 01:47

基本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
原创粉丝点击