.NET应用程序没有关闭

时间:2013-04-03 13:53:26

标签: .net multithreading backgroundworker

我有一个相当WPF的应用程序有一个奇怪的行为:我在调试时关闭它,窗口关闭但调试(所以应用程序本身)仍在运行。我正在谈论单击窗口上的关闭按钮 - 通过单击停止调试工作强制关闭。

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

让我们说这不是图书馆的错,用Show()取代它(这将是相同的,只有没有进度窗口)仍会显示相同的症状。知道如何开始诊断吗?

3 个答案:

答案 0 :(得分:2)

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

MSDN Documentation for Shutdownmode

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;
   }
}

答案 1 :(得分:1)

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

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

答案 2 :(得分: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。