在后台工作者中使用进度条
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 上的代码更新内容无法执行。
要走的路是:
- 实现后台worker的进度事件,让后台worker在这个事件中汇报进度(这个会在UI线程的上下文中调用,不用担心跨线程问题)
- 使进度 "dialog" 成为最顶部的正常 window,看起来像一个对话框(您可能需要实施更多的东西以确保它不能被停用并禁用主 window,因为它将继续响应。
- 在进度事件处理程序中,更新辅助 window 中的进度状态。
你现在在评论里说你的进度条实际上是跑马灯,不显示任何实际进度。对解决方案来说并不重要——只是不要做进度更新的事情。
问题是 ShowDialog
会阻塞您的 UI 线程,直到对话框关闭,您无法通过代码执行此操作。让它成为一个非模态对话框,你应该没问题。
我有 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 上的代码更新内容无法执行。
要走的路是:
- 实现后台worker的进度事件,让后台worker在这个事件中汇报进度(这个会在UI线程的上下文中调用,不用担心跨线程问题)
- 使进度 "dialog" 成为最顶部的正常 window,看起来像一个对话框(您可能需要实施更多的东西以确保它不能被停用并禁用主 window,因为它将继续响应。
- 在进度事件处理程序中,更新辅助 window 中的进度状态。
你现在在评论里说你的进度条实际上是跑马灯,不显示任何实际进度。对解决方案来说并不重要——只是不要做进度更新的事情。
问题是 ShowDialog
会阻塞您的 UI 线程,直到对话框关闭,您无法通过代码执行此操作。让它成为一个非模态对话框,你应该没问题。