2

我有一个相当 WPF 应用程序有一个奇怪的行为:在调试时关闭它后,窗口被关闭但调试(因此应用程序本身)仍在运行。我说的是单击窗口上的关闭按钮-通过单击停止调试来强制关闭有效。

我猜即使 UI 线程完成,一些后台线程仍在运行。我没有使用Thread该类的任何多线程代码,但是我正在使用一个名为的库Ookii.Dialogs,其中包含一个ProgressWindow与旧的BackgroundWorker. 这个类是我的主要嫌疑人,但是我相信我使用它正确 - 只是在处理程序中处理长时间运行的操作,DoWork通过调用显示进度,并使用类似于ReportProgress的方法启动它们,但它也显示了一个进度窗户。操作完成后,窗口自动关闭。Show()RunWorkerAsync

假设这不是图书馆的错,用 a 替换它BackgroundWorker(这将是相同的,只是没有进度窗口)仍然会显示相同的症状。知道如何开始诊断吗?

4

3 回答 3

1

将 Visual Studio 附加到正在运行的进程并暂停它。

看看线程以及它们在做什么。

于 2013-04-03T13:55:57.657 回答
1

不确定您是否有同样的问题,但同样的问题发生在我们身上。在您的Application课堂上,尝试设置ShutdownMode = ShutdownMode.OnMainWindowClose. 默认是最后一个窗口(即使没有打开窗口,这仍然是一个问题)。

关机模式的 MSDN 文档

public partial class App : Application
{
   protected override void OnStartup(StartupEventArgs args)
   {    
      ///Set this to OnMainWindowClose (defaults to OnLastWindowClose)
      ///This seems to prevent the app from running after the main window closes
      ///--alternate solution would be to call Application.Current.Shutdown() from  MainWindow.OnClosing
      ShutdownMode = ShutdownMode.OnMainWindowClose;
   }
}
于 2013-04-03T13:58:41.003 回答
1

找到了!问题是我创建了一个从未显示的窗口实例。这就是我所拥有的:

private CustomWindow myWindow;

public MainWindow() {
    this.myWindow = new CustomWindow();    
}

public void Button_Click(object sender, RoutedEventArgs e) {
    this.myWindow.Show();
}

即使我从未点击过按钮(因此从未显示窗口),仍然会创建一个 Window 实例并在内存中等待。这阻止了应用程序关闭。

像这样更改代码解决了问题:

private CustomWindow myWindow;

public MainWindow() {

}

public void Button_Click(object sender, RoutedEventArgs e) {
    this.myWindow = new CustomWindow();   
    this.myWindow.Show();
}

窗口现在仅在需要显示时创建(无论如何这是一种更好的方法),并且当它显示时,它实际上可以正确关闭 - 与第一种情况不同,当不单击按钮时使窗口处于奇怪的“已创建但从未实际显示或关闭”状态,这阻止了应用程序关闭,因为正如 crashmstr 指出的那样,我的应用程序的默认 ShutdownMode 为 OnLastWindowClose。

于 2013-04-03T14:15:25.093 回答