我有一个相当WPF的应用程序有一个奇怪的行为:我在调试时关闭它,窗口关闭但调试(所以应用程序本身)仍在运行。我正在谈论单击窗口上的关闭按钮 - 通过单击停止调试工作强制关闭。
我猜即使UI线程完成,一些后台线程仍然在运行。 我没有使用Thread
类的任何多线程代码,但是我正在使用名为Ookii.Dialogs
的库,其中包含{ {1}}类与旧的ProgressWindow
非常相似。这个类是我的主要嫌疑,但我相信我正确使用它 - 只需处理BackgroundWorker
处理程序中的长时间运行操作,通过调用DoWork
显示进度,并使用{{1}启动它们方法,类似ReportProgress
,但它也显示进度窗口。操作完成后,窗口将自动关闭。
让我们说这不是图书馆的错,用Show()
取代它(这将是相同的,只有没有进度窗口)仍会显示相同的症状。知道如何开始诊断吗?
答案 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。