Vb.net 如何正确终止应用程序?

Vb.net 如何正确终止应用程序?,vb.net,garbage-collection,terminate,Vb.net,Garbage Collection,Terminate,过去,为了结束我的应用程序,我通常会在键下添加以下行: If e.KeyCode = Keys.Escape Then End 然而,在阅读了有关End实际功能的文档后,发现从释放资源等方面来说,这可能是结束应用程序最糟糕的方式之一 因此,现在我正在尝试找到一种建议的方法来终止应用程序,它将正确处理所有资源,等等。我发现了这两个问题 )但我无法得出正确答案到底是什么 上的公认答案是,将Close()应用于所有表单是正确的方法,将释放正确使用的所有资源。这在具有多个表单的应用程序中不方便,建议进

过去,为了结束我的应用程序,我通常会在
键下添加以下行:

If e.KeyCode = Keys.Escape Then End
然而,在阅读了有关
End
实际功能的文档后,发现从释放资源等方面来说,这可能是结束应用程序最糟糕的方式之一

因此,现在我正在尝试找到一种建议的方法来终止应用程序,它将正确处理所有资源,等等。我发现了这两个问题 )但我无法得出正确答案到底是什么

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

Application.Exit()
End
这将确保即使第一行失败,程序也会结束

另一方面,网站上被接受的答案是“在一个设计合理的应用程序中,您永远不必调用
Application.Exit()
”,这与上面的答案和下面的答案相矛盾,后者在.Net的更高版本中对所有表单都说
Application.Exit()
调用
Close()

这让我感到困惑,
Application.Exit()有什么问题

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

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


注意:尽管这个问题适用于我制作的所有程序,包括具有多种形式的程序,但我最近开始使用套接字(使用
TcpClient/Listener
类)在连接的中间终止程序时,在计算机之间建立连接,并将了解与此有关的任何附加信息。my中的一条注释向我保证调用
Socket.Close()
甚至是不必要的,但现在我意识到这可能不是完全正确的,因为我之前使用了
End
来终止。

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

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

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

您还需要考虑您拥有的任何前台线程的状态,因为这些线程可以允许所有窗体关闭,但将线程处理留在后台。p> End是一种非常暴力的技术,应该作为最后的解决方案使用。设计良好的应用程序应该能够通过关闭窗体或调用application.exit来关闭。我过去使用的方法是启动一个计时器,在调用应用程序之前调用End。退出。。。至少我给了它一个优雅地完成的机会

注意:应用程序。退出不会被阻止。所以
Application.Exit:End
也可能是
End
,这并不理想

以下是我使用的计时器:

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

但是现在我意识到这可能不是完全正确的,因为我在使用End-to-terminate之前
-如果调用
End
,执行将立即终止,并且不会进行优雅的垃圾收集(所有内容都将由操作系统释放)。因此,如果希望在使用
End
时正常关闭连接,则或多或少需要调用
Socket.Close()
。但是如果使用
End
,也有可能在套接字处理完成之前终止执行。仅在调试时,不建议对应用程序版本使用
End
。@visualincent谢谢,我想我会避免
End
。顺便问一下,为什么要编辑这个问题?这只适用于.net?我从标题中删除了“VB”,因为它是不必要的,建议不要在那里编写语言或标记。用“vb.net”标记问题就足够了,因为这已经表明了您使用的语言。请看:@VisualIncent好的,谢谢,我以后会记住的!我刚刚尝试过搜索,但没有任何结果:如果您没有编写任何代码明确停止此操作,是否有
Application.Exit()
无法关闭应用程序?是的。窗体可以在其FormClosing事件中阻止它。如果不终止线程,线程也可以保持其打开状态。这主要是一个信号,让应用程序优雅地关闭,这是由开发者来实现的,但这并不太困难。请参阅我关于退出计时器的说明,了解一些可以确保它最终关闭的内容。谢谢,我将使用退出计时器方法(我认为它会阻止)。顺便问一下,如果我不处理它们,即使是由任务创建的线程也会阻止它关闭吗?不,它们是后台线程,所以不要阻止关闭。因此,在我的示例中如何使用
forceExitTimer