【发布时间】:2014-01-19 17:15:30
【问题描述】:
在 Windows 窗体上开发解决方案时,我进入了一个向用户显示持续进度的例程。我实现了带有连续进度条的简单虚拟窗口:
在解决方案树中,它与主窗口位于同一级别:
在做某事时显示持续进步的最简单的工作方法是以下代码。它确实有效:
//This method works
private void DoSomeBackgroundStuffWithShow()
{
ContinuousProgressWindow continuousProgressWindow =
new ContinuousProgressWindow();
BackgroundWorker backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += (sender, arguments) =>
{
//Do some stuff for 4 seconds
Thread.Sleep(4000);
};
backgroundWorker.RunWorkerCompleted += (sender, arguments) =>
{
//Window is closed when needed. Great!
continuousProgressWindow.Dispose();
};
continuousProgressWindow.Show(this);
backgroundWorker.RunWorkerAsync();
}
但我需要此窗口出现在最顶部并在工作时阻止其父级。以下代码非常相似,但它不起作用 - 显示对话框,但 从未关闭:
//This method DOES NOT WORK
private void DoSomeBackgroundStuffWithShowDialog()
{
ContinuousProgressWindow continuousProgressWindow =
new ContinuousProgressWindow();
BackgroundWorker backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += (sender, arguments) =>
{
//Do some important stuff for 4 seconds
Thread.Sleep(4000);
};
backgroundWorker.RunWorkerCompleted += (sender, arguments) =>
{
//None of the following work for "ShowDialog() method"
//Ran with debugger - breakpoints not hit!
continuousProgressWindow.DialogResult = DialogResult.OK;
continuousProgressWindow.Close();
continuousProgressWindow.Dispose();
};
continuousProgressWindow.ShowDialog(this);
backgroundWorker.RunWorkerAsync();
}
然后,我意识到问题在于 UI 线程流:当进度窗口作为对话框运行时,MainWindow 线程被冻结,并且无法由RunWorkerCompleted 委托中的BackgroundWorker 调用以关闭对话框。
最简单的解决方案是什么?
【问题讨论】:
-
使用 showDialog,
backgroundWorker.RunWorkerAsync();直到continuousProgressWindow退出时才会被调用。您是否尝试过在显示窗口之前启动backgroundWorker? -
@StevenMills 我刚刚尝试过,它奏效了。发布带有编辑和注释代码的答案,我会接受。
-
等待想要接受有用的答案。太多的人只是读了答案就永远消失了。
标签: c# multithreading winforms dialog .net-3.5