.NET结束 vs Form.Close() vs Application.Exit 关闭应用程序的更好方法

15
有时候,在调试程序的时候,当我使用Form.close()关闭窗体后,虽然窗体已经关闭了,但应用程序仍然在运行。我注意到这种行为是在使用msgbox函数时发现的。
我没有任何线程或计时器正在运行,那么关闭.NET应用程序的最佳方式是什么?我正在使用VB.NET。
谢谢
6个回答

23
您所描述的情况非常可疑。每当关闭程序的启动窗体时,整个应用程序应该自动退出,包括关闭所有其他打开的窗体。确保您关闭了正确的窗体,就不应该遇到任何问题。
另一种可能性是,您已更改项目(使用其属性页面),使其在所有打开的窗口都关闭之前不关闭。在此模式下,您的应用程序将不会退出,直到最后一个剩余的打开窗体被关闭。如果您选择了此设置,则必须确保调用已显示的所有窗体的Close方法,而不仅仅是启动/主窗体。
第一种设置是默认设置,有其原因,如果您已更改它,您可能需要返回修复它。对于普通应用程序来说,这是迄今为止最直观的模型,并且可以防止您描述的情况发生。要使其正常工作,请确保已将您的主窗体指定为“启动窗体”(而不是闪屏或登录窗体)。
我所说的设置在此处突出显示:

   Visual Studio Project Properties

但是,需要注意的是,在设计良好的应用程序中,您不应该需要调用Application.Exit。如果您发现自己必须这样做才能完全关闭程序,则表示您正在做一些错误的事情。只要有充分的理由,那么这样做本身并不是一个坏习惯。其他两个答案未能解释清楚这一点,因此我认为它们最多是不完整的。


谢谢你的回答。我没有更改你所说的那些设置,所以我不明白为什么当我关闭我的窗体时整个应用程序不会关闭;但是,我很快会提供有关该应用程序的进一步详细信息。 - GianT971

11
在 .Net 1.1 及更早版本中,调用 Application.Exit 并不明智,MSDN 文档明确建议避免使用它,因为所有消息处理将立即停止。
然而在后续版本中,调用 Application.Exit 将导致关闭应用程序中的所有打开窗体,从而让您有机会在退出前清理自己的工作或甚至取消操作。

感谢您的解释和链接。 - GianT971
你忘了提到一个正确设计的应用程序不应该发现自己必须调用Application.Exit才能正常退出。你的答案在某种程度上是正确的,但它还不够完整。 - Cody Gray
1
@Cody,好的。我并不是真的想说服他使用其中之一。只是在说明当调用Application.Exit时会发生什么。我同意通常情况下,您会希望在主窗体关闭时设置关闭模式为关闭,但我可以想到半打场景不是这种情况。说调用Application.Exit表明应用程序设计不良是完全错误的。只有在盲目选择使用其中之一而不考虑原因时才会导致设计不良 ;) - Josh
是的,就像我说的,你的答案并不是错误的。但有时在Stack Overflow上,你必须尝试读懂人们的想法。我对问题的理解是,提问者想知道为什么他们的应用程序没有按照他们预期的方式关闭。加入一个Application.Exit调用实际上会解决这个问题,很多人会在那里停止。(就像这里发生的情况一样,因为你的答案被接受了。)这显然不是你的错,但这是我试图记住的事情。大多数人确实盲目选择使用任何“有效”的东西,而不考虑原因。不幸的是,这是现实。 - Cody Gray
@Cody,值得注意的是,Application.Exit和ShutdownMode == OnMainWindowClose是非常不同的东西。OnMainWindowClose将隐式调用Application.Shutdown,这将忽略在任何后续Form.Closing事件期间取消该事件的任何尝试。我认为这正是为什么WPF默认将ShutdownMode设置为OnLastWindowClose的原因。 - Josh
显示剩余3条评论

3

如果您在循环(Do While,For等)中调用Me.Close(),则应跟随一个Exit命令(Exit Do等)或Return()以强制消息处理正常终止。我曾经发现由此引起的程序挂起。


1

只需在您的代码中放置 "End" 关键字。

Sub Form_Load()
  Dim answer As MsgBoxResult
  answer = MsgBox("Do you want to quit now?", MsgBoxStyle.YesNo)
  If answer = MsgBoxResult.Yes Then
      MsgBox("Terminating program")
      End 
  End If 
End Sub

1

Application.Exit()可以关闭你的应用程序,但有些情况下它无法关闭应用程序。

EndApplication.Exit()更好。


在窗体应用程序中,永远不要调用End。 - HackSlash

0

Form.Close() 用于关闭 .NET 应用程序中的一个窗体实例,它不会终止整个应用程序。Application.exit() 才会终止你的应用程序。


谢谢你的回答,它也帮助了我。 - GianT971

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