【问题标题】:.NET End vs Form.Close() vs Application.Exit Cleaner way to close one's app.NET End vs Form.Close() vs Application.Exit Cleaner 关闭应用程序的方法
【发布时间】:2011-06-25 23:19:06
【问题描述】:

有时,当我在调试程序时使用 Form.close() 时,虽然窗体已关闭,但应用程序仍在运行。我在使用 msgbox 函数时注意到了这种行为。

我没有运行线程或计时器,那么关闭 .NET 应用程序的最佳方法是什么?我正在使用 VB.NET。

谢谢

【问题讨论】:

    标签: .net vb.net winforms exit


    【解决方案1】:

    Application.Exit() 会杀死您的应用程序,但在某些情况下它不会关闭应用程序。

    End 优于 Application.Exit()

    【讨论】:

    • 永远不要在表单应用程序中调用 End。
    【解决方案2】:

    只需在代码中添加“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
    

    【讨论】:

      【解决方案3】:

      如果你在一个循环中(Do While, For, ...)并且你调用Me.Close(),你应该跟随一个退出命令(Exit Do, ...)或Return()来强制消息处理以正确终止。我发现程序因此而挂起。

      【讨论】:

        【解决方案4】:

        你描述的情况很可疑。每当您关闭程序的启动表单时,整个应用程序都应该自动退出,包括关闭所有其他打开的表单。确保您关闭了正确的表单,并且您应该不会遇到任何问题。

        另一种可能性是您已将项目(使用其属性页面)更改为在关闭所有 个打开的窗口之前关闭。在此模式下,您的应用程序将在 最后 个剩余打开的表单关闭之前退出。如果您选择了此设置,则必须确保调用了您在应用过程中显示的所有表单的Close 方法,而不仅仅是启动/主表单。

        第一个设置是默认设置是有原因的,如果您更改了它,您可能想重新修复它。
        到目前为止,它是正常应用程序中最直观的模型,并且可以完全防止您描述的情况。要使其正常工作,请确保您已将 表单指定为“启动表单”(而不是启动屏幕或登录表单)。

        我所说的设置在这里突出显示:

           

        但首先,请注意您永远不必在设计合理的应用程序中调用Application.Exit。如果您发现自己必须这样做才能完全关闭您的程序,那么您做错了什么。只要你有充分的理由,这样做本身并不是一个坏习惯。其他两个答案无法解释这一点,因此我觉得充其量是不完整的。

        【讨论】:

        • 感谢您的回答。我没有更改您所说的设置,所以我不明白为什么当我关闭表单时整个应用程序没有关闭;不过,我很快就会提供有关该应用程序的更多详细信息。
        【解决方案5】:

        在 .Net 1.1 及更早版本中,Application.Exit was not a wisechoice 和 MSDN 文档特别建议不要这样做,因为所有消息处理都会立即停止。

        然而,在以后的版本中,calling Application.Exit 将导致在应用程序中所有打开的表单上调用 Form.Close,从而让您有机会自行清理,甚至一起取消操作。

        【讨论】:

        • 坦克的解释和链接
        • 你忘了提到一个设计合理的应用程序永远不会发现自己必须调用Application.Exit才能正确退出。就目前而言,您的答案是正确的,但还远远不够。
        • @Cody,很公平。我并不是真的试图说服他使用其中一种。仅展示调用 Application.Exit 时会发生什么。我同意通常您希望将关闭模式设置为在主窗体关闭时关闭,但我可以想到六种情况并非如此。说调用 Application.Exit 表示应用程序设计不佳是完全错误的。如果您盲目地选择使用其中一种而不考虑原因,那只会是糟糕的设计;)
        • 是的,就像我说的,你的答案没有错。但有时在 Stack Overflow 上,你必须尝试读懂人们的想法。我对这个问题的解读是提问者想知道为什么他们的应用程序没有按照他们预期的方式关闭。打个电话给Application.Exit 实际上会解决这个问题,很多人会停在那里。 (可能发生在这里,看到你的答案被接受了。)这显然不是你的错,但这是我试图记住的事情。大多数人确实盲目地选择使用任何“有效”的东西而不考虑原因。不幸,但真实。
        • @Cody,值得注意的是 Application.Exit 和 ShutdownMode == OnMainWindowClose 是非常不同的野兽。 OnMainWindowClose 将隐式调用 Application.Shutdown,它忽略在任何后续 Form.Closing 事件期间取消该事件的任何尝试。我认为这正是他们在 WPF 中将 ShutdownMode 默认为 OnLastWindowClose 的原因。
        【解决方案6】:

        Form.Close() 用于在 .NET 应用程序中关闭 Form 的实例,它不会杀死整个应用程序。 Application.exit() 杀死你的应用程序。

        【讨论】:

        • 感谢您的回答,对我也有帮助
        猜你喜欢
        • 2012-10-14
        • 2010-11-21
        • 1970-01-01
        • 2013-05-17
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多