【发布时间】:2016-08-16 20:57:18
【问题描述】:
过去,我通常会在 KeyDown 子中添加以下行以结束我的应用程序:
If e.KeyCode = Keys.Escape Then End
但是,在阅读有关 End 实际操作的文档后,事实证明,就释放资源等而言,它可能是结束应用程序的最糟糕的方式之一。
所以现在我正在尝试找到推荐的方法来终止将正确处理所有资源等的应用程序。我在 SO (here 和 here) 但我无法得出正确答案到底是什么。
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