Winforms:Application.Exit vs Environment.Exit vs Form.Close (Winforms: Application.Exit与Environment.Exit与Form.Close的区别)

88
以下是退出应用程序的三种方法:
  1. Environment.Exit(0)
  2. Application.Exit()
  3. Form.Close()
这三种方法之间有什么区别,何时应使用每种方法呢?

9
这不是一个重复的问题。我不是在询问要使用哪一个来退出应用程序。我只是想知道这些方法之间的区别,因为它们执行类似的操作。 - Parag Meshram
2个回答

140
正确的方法应该是 Application.Exit()。根据文档,它终止所有消息循环并关闭所有窗口,从而使您的窗体有可能执行其清理代码(在Form.OnClose等中)。 Environment.Exit将只会杀死进程。如果某个窗体例如有未保存的更改,则不会有任何机会询问用户是否要保存这些更改。此外,资源(如数据库连接等)可能无法正确释放,文件可能未被刷新等。 Form.Close仅做其所述:关闭一个窗体。如果您打开了其他窗体(也许现在没有,但在您的应用程序的某个未来版本中可能会出现),则应用程序将不会终止。
请记住,如果您使用多线程,Application.Exit()将不会终止您的线程(因此即使GUI已终止,应用程序仍将在后台工作)。因此,您必须采取措施来终止线程,或者在主函数(即Program.Main())或主窗体的OnClose事件中终止线程。

4
您可以在线程上设置IsBackground属性,这样它们就不会阻止进程终止。 - Rolf Bjarne Kvinge
1
你所说的关于刷新文件的内容是真的吗?当一个进程被终止时,操作系统应该关闭所有现有的句柄,这也会刷新句柄。 - Esben Skov Pedersen
3
@EsbenSkovPedersen 但是可能存在操作系统不知道的内部缓存(在应用程序、.Net框架、第三方库等中)。 - MarkJ
@Giorgi 这在很大程度上取决于线程的设计方式,这是一个独立的问题。通常最好的方法是提供一些机制来“告诉”线程完成其工作。然后,您可以使用 Thread.Join() 等待直到它真正完成并在之后调用 Application.Exit()。您也可以尝试调用 Thread.Abort(),但这通常不是一个好的选择,应该谨慎使用。搜索类似于 https://dev59.com/BnNA5IYBdhLWcg3wNa-T 的问题,我想在 StackOverflow 上有很好的答案... - MartinStettner
1
你关于 Form.Close 的注释是不正确的。如果主窗体关闭,整个应用程序也会随之关闭,而不会引发任何子窗体的 FormClosing/FormClosed 事件。进程退出。另一方面,Application.Exit 允许你优雅地处理每个子窗体的关闭/已关闭事件。 - nawfal
在2022年的Windows Forms中,我不得不使用Environment.Exit(0)。如果我使用了Application.Exit(),应用程序仍然会继续运行。即使Application.Exit()出现在Application.Run(new Form1())之前也是如此! - Ed Graham

4

它们都很好。

但是 form.Close() 不会关闭您的应用程序,它只会关闭窗体后,主方法将返回一个整数(退出代码)。

如果您希望应用程序使用退出代码退出,请使用Environmet.Exit(exitcode)或在主方法中返回退出代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接