WPF应用程序无法正确关闭。

7

我正在从一个绑定到xaml窗口的类中使用ObjectDataProvider调用Application.Current.Shutdown(),但应用程序没有关闭。有人能帮我理解为什么吗?我的应用程序在主窗口关闭后没有完全关闭,它不会从任务管理器的进程列表中消失。

6个回答

26

尝试使用 Environment.Exit(0) 代替


3
override OnStartup() 中调用 Shutdown() 无法正常工作,改为使用 Environment.Exit(0) - Jake Berger

11

你是否创建了任何用于后台处理的线程?如果创建了,请确保在它们上面设置.IsBackground属性,否则它们会使应用程序一直运行。


不,我没有直接创建线程,也许WPF会在其他线程中进行绑定或使用ObjectDataProvider资源? - Arsen Mkrtchyan

5

不要忘记添加这个:

private void Window_Closed(object sender, EventArgs e)
{
  Application.Current.Shutdown();
}

希望这可以帮助到您。

1
如果您的应用程序中有多个窗口或对话框,则可能需要显式关闭每个窗口或对话框。
使用以下代码关闭对话框:

_myDialog.Close();

关闭所有窗口:

foreach(var window in Application.Current.Windows.ToList())
{
    window.Close();
}

我尝试了这个,但没有帮助。后来我意识到问题出在哪里了。问题是当我调用shutdown()或close()时,objectdataprovider的执行并没有终止。我想最好还是提出一个新的问题,问一下现在该怎么办 :) - Arsen Mkrtchyan
你肯定可以用foreach替换for(i...)吧?手动迭代循环已经过时了 :-) - Orion Edwards

1

我遇到了一个问题,即使主窗口关闭了,应用程序也无法关闭。原来我在闪屏界面上使用了Hide()而不是Close(),导致它仍然潜伏在后台,保持应用程序的运行。


0

我遇到了同样的问题,应用程序进程并没有停止,尽管应用程序已经关闭。

在我的情况下,我从BackgroundWorker打开了一个窗口(以下是代码)

BackgroundWorker BG = new BackgroundWorker();
BG.DoWork += new DoWorkEventHandler(BG_DoWork);
StockMinWindow MinWindow = new StockMinWindow(null); -------- this is the problem 
BG.RunWorkerAsync();

在运行BackgroundWorker之前实例化窗口似乎不是问题,但删除该行后,应用程序正确关闭

我使用主线程从BackgroundWorker打开我的窗口(以下是代码)

 View.Dispatcher.BeginInvoke(new Action(delegate()
 {
   StockMinWindow MinWindow = new StockMinWindow(StockMinList);
   MinWindow.Owner = View;
   MinWindow.ShowDialog();
 }));

希望能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接