在后台工作程序中使用进度条
本文关键字:后台 工作程序 | 更新日期: 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上的代码更新内容也无法执行,原因相同。
要走的路是:
- 实现后台工作人员的进度事件,并让后台工作人员在此事件中报告进度(这将在UI线程的上下文中调用,因此您不必担心跨线程问题)
- 使进度"对话框"成为一个最顶部的普通窗口,看起来像一个对话框(您可能需要实现更多的东西,以确保它不会被停用和禁用主窗口,因为它将继续响应)
- 在进度事件处理程序中,更新辅助窗口中的进度状态
你现在在评论中说,你的进度条实际上是一个字幕,没有显示任何真正的进展。对解决方案来说并不重要——只是不要做进度更新之类的事情。
问题是ShowDialog
会阻塞您的UI线程,直到对话框关闭,而这在您的代码中是无法做到的。让它成为一个非模态对话框,你应该会没事的。