Environment.Exit(0) or Application.Exit() 之后,应该使用哪个?

21 浏览
0 Comments

Environment.Exit(0) or Application.Exit() 之后,应该使用哪个?

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

  1. Environment.Exit(0)
  2. Application.Exit()
  3. Form.Close()

这三种方法之间有什么区别?何时使用每一种方法?

0
0 Comments

无论是使用Environment.Exit(0)还是Application.Exit(),都是可以的。但是form.Close()只会关闭窗体,而不会关闭整个应用程序,它只会在主方法中返回一个整数(退出码)。如果想要应用程序以退出码的方式退出,请使用Environment.Exit(exitcode)或在主方法中返回退出码。

0
0 Comments

在使用Windows Forms时,需要选择使用Application.Exit()Environment.Exit(0)来终止应用程序。这个问题的出现是因为这两个方法在功能和效果上有所不同,需要根据具体的需求来选择使用哪种方法。

根据官方文档,Application.Exit()方法会终止所有的消息循环并关闭所有的窗口,从而给窗体执行清理代码的机会(例如在Form.OnClose中)。而Environment.Exit(0)方法则会直接杀死进程,如果某个窗体有未保存的更改,就无法询问用户是否要保存。此外,资源(如数据库连接)可能无法正确释放,文件可能无法刷新。

Form.Close方法仅仅是关闭一个窗体,如果还有其他窗体打开(即使现在没有,但在应用程序的未来版本可能会有),应用程序将不会终止。

需要注意的是,如果使用多线程,Application.Exit()方法不会终止线程(即使GUI已经终止,应用程序仍然会在后台运行)。因此,必须采取措施来终止线程,可以在主函数(即Program.Main())中终止线程,或者在主窗体的OnClose事件中终止线程。

关于刷新文件的问题,当进程被终止时,操作系统会关闭所有存在的句柄,从而刷新句柄。但是,可能存在操作系统不知道的内部缓存(在应用程序、.Net框架、第三方库等中),所以无法保证所有缓存都被正确刷新。

关于线程的设计,这取决于线程的具体实现方式,这是一个独立的问题。通常,最好的方式是提供一种机制来“告诉”线程完成其工作。然后可以使用Thread.Join()等待线程真正完成工作,然后调用Application.Exit()方法。也可以使用Thread.Abort(),但这通常不是一个好的选择,应谨慎使用。可以在StackOverflow等问答网站上搜索相关问题,会有很好的答案。

关于Form.Close的说明是不准确的。如果主窗体关闭,整个应用程序也会关闭,不会触发子窗体的FormClosingFormClosed事件。进程会立即退出。而Application.Exit方法则允许优雅地处理每个子窗体的关闭事件。

对于某些情况下,例如在2022年使用Windows Forms时,可能需要使用Environment.Exit(0)方法。如果使用Application.Exit()方法,应用程序将继续运行。即使Application.Exit()Application.Run(new Form1())之前调用!

0