C# 对BackgroundWorker的简单包装

本文介绍了如何在C#中对BackgroundWorker进行简单的组件包装,旨在简化使用过程,使其更方便地通过VS2012工具箱拖放,并通过属性视图配置。
摘要由CSDN通过智能技术生成

C# 对BackgroundWorker的简单包装

BackgroundWorker用起来是蛮舒服的,但让我这种懒癌晚期的老老实实去为了开一个线程实例个对象再配置有点不现实,于是想写个Component来包装一下。
IDE是VS2012,目标是这样,可以从工具箱拖放,可以用属性视图来配置
这里写图片描述
这里写图片描述
程序很简单

namespace BackgroundWorkerTools {
    public class BackgroundWorkerTools : Component {
        //BackgroundWorker对象
        private BackgroundWorker activeWorker;
        [Browsable(false)]
        public BackgroundWorker ActiveWorker {
            get {
                return activeWorker;
            }
            set {
                activeWorker = value;
                if (activeWorker != null) {
                    worker.WorkerSupportsCancellation = true;
                    worker.WorkerReportsProgress = true;
                    worker.DoWork += new DoWorkEventHandler(this.BackgoundWorker_DoWork);
                    worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.BackgoundWorker_Completed);
                    worker.ProgressChanged += new ProgressChangedEventHandler(this.BackgoundWorker_ProgressChanged);
                }
            }
        }
        //忙标志
        [Browsable(false)]
        public bool IsBusy {
            get {
                if (this.ActiveWorker != null) {
                    return this.ActiveWorker.IsBusy;
                } else {
                    return false;
                }
            }
        }
        //事件
        public event EventHandler Begin;
        public event DoWorkEventHandler DoWork;
        public event RunWorkerCompletedEventHandler Completed;
        public event ProgressChangedEventHandler ProgressChanged; 

        private void BackgoundWorker_DoWork(object sender, DoWorkEventArgs e) {
            BackgroundWorker bw = sender as BackgroundWorker;
            if (this.DoWork != null) {
                this.DoWork(sender, e);
            }
            if (bw.CancellationPending == true) {
                bw.Dispose();
                return;
            }
        }

        private void BackgoundWorker_Completed(object sender, RunWorkerCompletedEventArgs e) {
            if (this.Completed != null) {
                this.Completed(sender, e);
            }
        }

        private void BackgoundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) {
            if (this.ProgressChanged != null) {
                this.ProgressChanged(sender, e);
            }
        }
        //执行 argument-参数 restart-重启标志
        public void RunWorker(object argument = null, bool restart = false) {
            if (this.ActiveWorker == null) {
                this.ActiveWorker = new BackgroundWorker();
            } else if (this.ActiveWorker.IsBusy == true) {
                if (restart == false) {
                    return;
                }
                //若ActiveWorker忙 且 ActiveWorker将取消或者重启
                if (this.ActiveWorker.CancellationPending == true || restart == true) {
                    //重新实例化ActiveWorker
                    this.ActiveWorker = new BackgroundWorker();
                }
            }

            if (this.Begin != null) {
                this.Begin(this, null);
            }

            if (argument == null) {
                this.ActiveWorker.RunWorkerAsync();
            } else {
                this.ActiveWorker.RunWorkerAsync(argument);
            }
        }
        //取消
        public void Cancel() {
            if (this.IsBusy == true) {
                this.ActiveWorker.CancelAsync();
            }
        }
        //报告进度
        public void ReportProgress(int percentProgress, object userState = null) {
            if (userState == null) {
                this.ActiveWorker.ReportProgress(percentProgress);
            } else {
                this.ActiveWorker.ReportProgress(percentProgress, userState);
            }
        } 
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值