C# 进度条封装
主要是使用BackgroundWorker控件实现异步刷新……
public class ProgressTool
{
private BackgroundWorker backgroundWorkerProgress;
public ProgressTool()
{
//
// backgroundWorkerProgress
//
this.backgroundWorkerProgress = new System.ComponentModel.BackgroundWorker();
this.backgroundWorkerProgress.WorkerReportsProgress = true;
this.backgroundWorkerProgress.WorkerSupportsCancellation = true;
this.backgroundWorkerProgress.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorkerProgress_DoWork);
this.backgroundWorkerProgress.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorkerProgress_RunWorkerCompleted);
}
public void StartBar(Form dialog, int maxVal)
{
// 为了开始在后台操作,必须调用BackgroundWorker的RunWorkerAsync()方法,当调用此方时,BackgroundWorker 通过触发DoWork 事件,开始执行后台操作,DoWork 事件的代码是在另一个线程里执行的。
if (this.backgroundWorkerProgress.IsBusy)
return;
this.backgroundWorkerProgress.RunWorkerAsync(maxVal);
// 显示进度条窗体
FormProgress form = new FormProgress(this.backgroundWorkerProgress);
form.ShowDialog(dialog);
form.Close();
}
public Func<int, string> BackgroundFunc = null;
private void backgroundWorkerProgress_DoWork(object sender, DoWorkEventArgs e)
{
int maxval = Convert.ToInt32(e.Argument);
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 0; i < maxval; i++)
{
if (this.BackgroundFunc != null)
{
string strShow = BackgroundFunc(i);
// 注意:这里向子窗体返回信息值,这里是两个值,一个用于进度条,一个用于文本框的。
worker.ReportProgress((int)(i * 100.0f / maxval), strShow + "\r\n");
}
// 如果用户取消则跳出处理数据代码
if (worker.CancellationPending)
{
// 利用CancellationPending 属性,可以判断是否取消后台异步操作。
e.Cancel = true;
break;
}
}
// 在执行DoWork 事件时,DoWorkEventArgs 实例的Result 属性,返回值到用户;在RunWorkerCompleted 事件里,RunWorkerCompletedEventArgs 实例的Result 属性接收值;
}
private void backgroundWorkerProgress_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// 当后台操作完成以后,无论是completed 还是cancelled,RunWorkerCompleted 事件被触发,通过此方法可以将后台操作的完成结果反馈给用户;
// 另外,通过RunWorkerCompletedEventArgs实例的Cancelled 属性,以判断是否是Cancel操作使得后台操作终止;
if (e.Error != null)
{
MessageBox.Show("发生异常错误 -> " + e.Error.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else if (e.Cancelled)
{
MessageBox.Show("用户取消", "已取消", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
// 执行完成
}
}
}
public partial class FormProgress : Form
{
//ProcessForm 窗体事件(进度条窗体)
private BackgroundWorker backgroundWorkerBar = null;
public FormProgress(BackgroundWorker backWorker)
{
InitializeComponent();
this.backgroundWorkerBar = backWorker;
this.backgroundWorkerBar.ProgressChanged += new ProgressChangedEventHandler(backgroundWorkerBar_ProgressChanged);
this.backgroundWorkerBar.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorkerBar_RunWorkerCompleted);
}
private void backgroundWorkerBar_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// 为了显示后台操作的执行进度,首先要使WorkerReportsProgress 等于true,然后调用BackgroundWorker的ReportProgress()方法,通过它传递操作完成的进度值
// 此外,该方法触发ProgressChanged事件,在是此事件中,通过ProgressChangedEventArgs的实例,接收到主线程传递过来的参数。
this.progressBarShow.Value = e.ProgressPercentage;
//主窗体传过来的值,通过e.UserState.ToString()来接受
this.textBoxBar.AppendText(e.UserState.ToString());
}
private void backgroundWorkerBar_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//执行完之后,直接关闭页面
this.Close();
}
private void buttonCancel_Click(object sender, EventArgs e)
{
// 为了使 BackgroundWorker 可以取消后台正在执行的操作,首先要把属性WorkerSupportsCancellation 的值设置为 true。
// 接着调用CancelAsync()方法,该方法使得属性CancellationPending 为true,
this.backgroundWorkerBar.CancelAsync();
this.buttonCancel.Enabled = false;
this.Close();
}
}