在后台工作者中使用进度条

using progress bar in background worker

我有 2 个表单,在第二个表单中我有一个进度条。 当我单击主窗体上的按钮时,会打开带有进度条的 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 工作时,marquee 进度条冻结并且应用程序似乎挂起。

我能做什么?

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

要走的路是:

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

你现在在评论里说你的进度条实际上是跑马灯,不显示任何实际进度。对解决方案来说并不重要——只是不要做进度更新的事情。

问题是 ShowDialog 会阻塞您的 UI 线程,直到对话框关闭,您无法通过代码执行此操作。让它成为一个非模态对话框,你应该没问题。