BackgroundWork(包含源码)
在WinForm程序中,当程序正在执行耗时的任务时,Form会出现用户界面停止响应(假死)的情况;有时候需要在界面上显示后台运行的进度,比如说ProgressBar。这时候可以新建一个线程,把耗时的任务放到线程中,也可以通过BackgroundWork来实现,并且BackgroundWork理解起来比较容易。
新建Form,添加进度条,BackgroundWork,TextBox,label和Button控件
两个属性设置为true
private void startBtn_Click(object sender, EventArgs e)
{
//调用backgroundWorker_DoWork
backgroundWorker.RunWorkerAsync();
}
/// <summary>
/// 要做的耗时的工作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 101; i++)
{
Thread.Sleep(500);
//报告进度,调用backgroundWorker_ProgressChanged
backgroundWorker.ReportProgress(i);
//取消操作,然后调用backgroundWorker_RunWorkerCompleted
if (backgroundWorker.CancellationPending == true)
{
e.Cancel = true;
break;
}
}
}
/// <summary>
/// 更新ui
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
textBox.Text = string.Format("后台耗时任务进行到第{0}步", e.ProgressPercentage);
progressBar.Value = e.ProgressPercentage;
percentLabel.Text = e.ProgressPercentage.ToString() + "%";
}
//后台操作完成,包括取消后台操作
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("完成");
}
//取消操作
private void cancelBtn_Click(object sender, EventArgs e)
{
backgroundWorker.CancelAsync();
}
开始执行
执行成功
取消之后也触发backgroundWorker_RunWorkerCompleted