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);
}
}
}
}