C# 子窗口显示进度条-BackgroundWorker 实现

需要掌握: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”的线程访问它。

参考:
https://www.cnblogs.com/JackFu/p/7838729.html