在后台工作程序中使用进度条

本文关键字:后台 工作程序 | 更新日期: 2023-09-27 18:24:37

我有两个表单,在第二个表单上有一个进度条。当我点击主窗体上的按钮时,打开带有进度条的Form2:

private void button1_Click(object sender, EventArgs e)
{
    this.ShowInTaskbar = false;
    this.Visible = false;
    bw.RunWorkerAsync();
    //Show Form2 with progress bar
    Show_pb();
}
Form2 f_pb = new Form2();
Show_pb()
{
    f_pb.ShowDialog();
    f_pb.Activate();
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    //... hard work...
}

之后,在bw_RunWorkerCompleted中,我将数据填充到Form1:中的一些控件中

void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    //...updating DataGridView and TreeView...
}

不幸的是,当bw_RunWorkerCompleted工作时,字幕进度条冻结,看起来应用程序挂起了。

我能做什么?

在后台工作程序中使用进度条

ShowDialog显示进度对话框会阻塞UI线程,因此无法更新进度。后台工作程序完成后,UI上的代码更新内容也无法执行,原因相同。

要走的路是:

  1. 实现后台工作人员的进度事件,并让后台工作人员在此事件中报告进度(这将在UI线程的上下文中调用,因此您不必担心跨线程问题)
  2. 使进度"对话框"成为一个最顶部的普通窗口,看起来像一个对话框(您可能需要实现更多的东西,以确保它不会被停用和禁用主窗口,因为它将继续响应)
  3. 在进度事件处理程序中,更新辅助窗口中的进度状态

你现在在评论中说,你的进度条实际上是一个字幕,没有显示任何真正的进展。对解决方案来说并不重要——只是不要做进度更新之类的事情。

问题是ShowDialog会阻塞您的UI线程,直到对话框关闭,而这在您的代码中是无法做到的。让它成为一个非模态对话框,你应该会没事的。