Winforms:Application.Exit vs Environment.Exit vs Form.Close

Posted

技术标签:

【中文标题】Winforms:Application.Exit vs Environment.Exit vs Form.Close【英文标题】:Winforms: Application.Exit vs Environment.Exit vs Form.Close 【发布时间】:2012-10-14 07:18:25 【问题描述】:

以下是我们可以退出应用程序的方式:

    Environment.Exit(0) Application.Exit() Form.Close()

这三种方法有什么区别,什么时候使用?

【问题讨论】:

这不是一个重复的问题。我不是在问使用哪一个来退出应用程序。我只是询问这些方法之间的区别,因为它执行类似的操作。 【参考方案1】:

正确的方法是Application.Exit()。根据Documentation,它会终止所有消息循环并关闭所有窗口,从而使您的表单可以执行其清理代码(在 Form.OnClose 等中)。

Environment.Exit 只会杀死进程。如果某种形式有例如未保存的更改将没有机会询问用户是否要保存它们。资源(数据库连接等)也无法正确释放,文件可能无法刷新等。

Form.Close 就像它所说的那样:它关闭了一个表单。如果您打开了其他表单(可能不是现在,而是在您的应用程序的某个未来版本中),应用程序不会终止。

请记住,如果您使用多线程,Application.Exit() 不会终止您的线程(因此应用程序将继续在后台运行,即使 GUI 已终止)。因此,您必须采取措施杀死线程,无论是在主函数中(即Program.Main())还是在主窗体的OnClose 事件中。

【讨论】:

您可以在线程上设置 IsBackground 属性,这样它们就不会阻止进程终止。 你所说的刷新文件真的是真的吗?当一个进程被杀死时,操作系统应该关闭所有现有的句柄,这也会刷新句柄。 @EsbenSkovPedersen 但可能存在操作系统不知道的内部缓存(在应用程序中、.Net 框架中、第三方库中等) @Giorgi 这在很大程度上取决于线程的设计方式,这本身就是一个问题。通常最好的方法是提供一些机制来“告诉”线程完成它的工作。然后你可以Thread.Join() 它,等到它真正完成后再打电话给Application.Exit()。您也可以致电Thread.Abort(),但这通常不是一个好的选择,应谨慎使用。搜索***.com/questions/1051838/killing-a-net-thread之类的问题,我猜***上有很好的答案...【参考方案2】:

他们都很好。 但form.Close() 不会关闭您的应用程序 它关闭表格,然后 主方法返回一个 int(退出代码)。

如果您希望您的应用程序使用退出代码退出,请使用 Environmet.Exit(exitcode) 或者在main-method中返回exitcode

【讨论】:

【参考方案3】:
Dim forceExitTimer = New Threading.Timer(Sub() End, Nothing, 2500, Timeout.Infinite)
Application.Exit()

这个方法很完美,让软件先用application.exit轻轻关闭,然后再调用残酷的End命令强行关闭软件

【讨论】:

以上是关于Winforms:Application.Exit vs Environment.Exit vs Form.Close的主要内容,如果未能解决你的问题,请参考以下文章

Application.Exit() - 关闭表单后应用程序仍在运行

调用 Application.Exit() 后,应用程序仍在内存中运行

c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit();Application.ExitThread(); System.Environmen

Application.Exit()结束程序,但线程还在的解决方法。

构建布局良好的Windows程序

C# 窗口和程序的退出