【问题标题】:How to correctly terminate an application?如何正确终止应用程序?
【发布时间】:2016-08-16 20:57:18
【问题描述】:

过去,我通常会在 KeyDown 子中添加以下行以结束我的应用程序:

If e.KeyCode = Keys.Escape Then End

但是,在阅读有关 End 实际操作的文档后,事实证明,就释放资源等而言,它可能是结束应用程序的最糟糕的方式之一。

所以现在我正在尝试找到推荐的方法来终止将正确处理所有资源等的应用程序。我在 SO (herehere) 但我无法得出正确答案到底是什么。

first link 上接受的答案说,将Close() 应用于所有表单是正确的方法,并将释放正确使用的所有资源。这在有多个表单的应用程序中不方便,建议进一步向下Application.Exit(),甚至:

Application.Exit()
End

即使第一行失败,也一定会确保程序结束。

另一方面,second link 上接受的答案说“您永远不必在设计合理的应用程序中调用Application.Exit()”,这与上述内容相矛盾,并且答案更下方这表示Application.Exit() 在.Net 更高版本中的所有表单上调用Close()

这让我很困惑——Application.Exit() 有什么问题?

如果没有问题,那么我认为最好的选择是正确的:

Application.Exit()
End

或者是不是太过分了?否则,Application.Exit() 什么时候不能工作(除非我写了取消它的代码)?

注意:虽然这个问题适用于我制作的所有程序,包括具有多种形式的程序,但我最近开始使用 Sockets(带有TcpClient/Listener 类)在计算机之间建立连接,如果有任何与此相关的其他信息,我将不胜感激在连接中间终止程序。我的recent question 中的一条评论向我保证,调用Socket.Close() 甚至没有必要,但现在我意识到这可能并不完全正确,因为我之前使用End 来终止。

【问题讨论】:

  • but now I realise that this may not be completely true since I was using End to terminate before - 如果你调用End,执行将立即终止,不会有优雅的垃圾收集(一切都将由操作系统释放)。所以是的,如果您希望在使用End 时正常关闭连接,您或多或少需要调用Socket.Close()但是如果你确实使用了End,那么你也有可能在套接字的处理完成之前终止执行。不建议在应用发布时使用End,仅在调试时使用。
  • @VisualVincent 谢谢,我想我会避开End。顺便说一句,为什么要编辑问题?这仅适用于 .net?
  • 我从标题中删除了“VB”,因为它是不必要的,建议不要在那里写你的语言或标签。用“vb.net”标记问题就足够了,因为这已经表明您使用的是什么语言。见:Should questions include tags in their titles?
  • @VisualVincent 好的,谢谢,我以后会记住的

标签: vb.net garbage-collection terminate


【解决方案1】:

Application.Exit 将退出消息发布到该应用程序的所有消息循环。

这是一种完全可以接受的关闭应用程序的方式,并且会导致所有表单尝试关闭。单个表单可以覆盖此行为,例如,如果它们有未保存的工作。这将使您的应用程序在之后运行,因此您需要决定是否需要处理。

说我只在外部参与者需要关闭我的应用程序时使用它。否则,当它的主窗体关闭时,我会让应用程序退出。

您还需要考虑您拥有的任何前台线程的状态,因为它们可以让您的所有表单关闭,但将线程处理留在后台。

End 是一种非常暴力的技术,应该作为最后的手段使用。一个设计良好的应用程序应该能够通过关闭表单或调用 application.exit 来关闭。我过去曾使用过启动计时器的方法,该计时器将在我调用 Application.Exit 之前调用 End ...至少我给了它一个优雅地完成的机会。

注意:Application.Exit 不会阻塞。所以Application.Exit : End 也可能是End,这并不理想。

这是我使用的计时器:

    Dim forceExitTimer = New Threading.Timer(Sub() End, Nothing, 2500, Timeout.Infinite)
    Application.Exit()

【讨论】:

  • 谢谢!我刚刚尝试搜索无济于事:如果您不编写任何明确停止此操作的代码,Application.Exit() 是否会关闭应用程序?
  • 是的。表单可以在其 FormClosing 事件中阻止它。如果您不终止线程,它们也可以保持打开状态。这主要是向应用程序发出正常关闭的信号,这取决于开发人员来实现,但这并不太难。请参阅我关于退出计时器的说明,以确保它最终关闭。
  • 谢谢,那我就用退出定时器的方法(我以为它确实阻塞了)。
  • 顺便说一句,如果我不处理它们,即使是由任务创建的线程也会阻止它关闭吗?
  • 不,它们是后台线程,所以不要阻止关机。因此,我如何在我的示例中使用 forceExitTimer
猜你喜欢
  • 1970-01-01
  • 2012-04-30
  • 2011-12-17
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 2015-11-22
  • 1970-01-01
相关资源
最近更新 更多