繁体   English   中英

在后台工作人员中使用进度栏

[英]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工作时, 跑马灯进度栏将冻结,并且看起来该应用程序已挂起。

我能做什么?

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

要走的路是:

  1. 实现后台工作程序的progress事件,并让后台工作人员在此事件中报告进度(这将在UI线程的上下文中调用,因此您不必担心跨线程问题)
  2. 将进度设置为“对话”,这是一个普通的窗口,该窗口最顶部且看起来像一个对话框(您可能需要实现其他功能,以确保不能将其禁用并禁用主窗口,因为它将继续响应)。
  3. 在进度事件处理程序中,在辅助窗口中更新进度状态。

您现在在评论中说,进度栏实际上是一个选取框,未显示任何实际进度。 解决方案并不重要-只是不进行进度更新。

问题是ShowDialog阻塞UI线程,直到对话框关闭为止,而这是您无法从代码中完成的。 使其成为非模态对话框,您应该可以。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM