在后台工作程序

时间:2015-11-27 07:52:15

标签: c# backgroundworker

我有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工作时,选取框进度条冻结,看起来该应用程序已挂起。

我该怎么办?

1 个答案:

答案 0 :(得分:2)

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

要走的路是:

  1. 实现后台工作程序的进度事件,并让后台工作程序在此事件中报告进度(这将在UI线程的上下文中调用,因此您不必担心跨线程问题)
  2. 使进度“对话框”成为最顶层的正常窗口,看起来像一个对话框(您可能需要实现更多内容以确保无法停用并禁用主窗口,因为它将继续响应)
  3. 在进度事件处理程序中,更新辅助窗口中的进度状态。
  4. 你现在在评论中说你的进度条实际上是一个选框,没有显示任何真正的进展。解决方案并不重要 - 只是不要进行更新。

    问题是ShowDialog阻止你的UI线程,直到对话框关闭,你无法从代码中做到这一点。使它成为一个非模态对话框,你应该没问题。