需要掌握:C# BackgroundWorker 执行耗时任务,并更新UI
进度条子窗口
Form窗口,界面如下:

创建窗口
修改属性
不显示标题栏:
屏幕居中显示:
不显示在任务栏:
代码
/// <summary>
/// 初始化进度条
/// </summary>
/// <param name="max"></param>
public void initProgressBar(int max)
{
progressBar.Visible = true;
// 设置进度条最小值.
progressBar.Minimum = 0;
// 设置进度条最大值.
progressBar.Maximum = max;
// 设置进度条初始值
progressBar.Value = 1;
// 设置每次增加的步长
progressBar.Step = 1;
}
/// <summary>
/// 设置进度条的进度
/// </summary>
/// <param name="i"></param>
public void setProgressBarValue(int i)
{
progressBar.Value = i;
}
/// <summary>
/// 设置进度条最大值
/// </summary>
/// <param name="i"></param>
public void setMax(int i)
{
// 设置进度条最大值.
progressBar.Maximum = i;
}
主窗口
创建进度条子窗口对象
进度条窗口定义成成员变量,可直接实例化
不要 在 BackgroundWorker的 DoWork() 方法中实例化,否则报错 从不是创建控件“progressBar”的线程访问它。
ProgressForm progressForm = new ProgressForm();
添加 BackgroundWorker
添加 DoWork 事件
该事件中加上耗时的任务
private void progressBgWorker_DoWork(object sender, DoWorkEventArgs e)
{
progressForm.initProgressBar(10);
for (int flbIndex = 0; flbIndex < 10; flbIndex++)
{
progressBgWorker.ReportProgress(progress+1);
}
}
添加 progressChanged 事件
该事件增加更新 UI 代码
/// <summary>
/// 更新UI
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void progressBgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// 设置进度条
this.progressForm.setProgressBarValue(e.ProgressPercentage);
// 设置进度条窗口的标题
progressForm.Text = "正在合并 " + e.ProgressPercentage + "/" + fileLstBx.Items.Count;
}
添加 RunWorkerCompleted 事件
// 完成时提示,并关闭窗口
private void progressBgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("合并成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
progressForm.Close();
}
启动 BackgroundWorker
progressBgWorker.RunWorkerAsync();
progressForm.ShowDialog();
注意:
调用 RunWorkerAsync() 后,就显示进度条窗口
不要 在 BackgroundWorker 的 DoWork() 方法中显示进度条窗口,否则报错 从不是创建控件“progressBar”的线程访问它。








