这些关闭我的应用程序的方法有什么区别?

基本上我有一个主表单,在加载时打开一个子表单登录用户。 当他们取消或关闭此登录表单时,我需要关闭整个应用程序。

但似乎有几种不同的方法可以关闭C#程序:

  1. Application.Exit();

  2. Application.ExitThread();

  3. Environment.Exit(1);

  4. Process.GetCurrentProcess().Kill();

  5. SFTPClient.LDAPLoggedIn = false; Close();

编辑: 对不起,如果这个不清楚:它在控制器对象中设置一个属性,以指示登录失败。 打开子表单后,我会在父表单中检查此属性,以查看程序是否应该继续。 它基本上将退出计划的责任转移到了父母身上,没有例外。

6: throw new Exception("User closed the form");

我可以看到有两种处理方式:

  • 告知父母出错的地方(如5和6所示)
  • 从子表单关闭程序。

这两个中的任何一个都被视为更好的做法

每种方法似乎对我的程序都有相同的影响,但它们实际上是如何比较的?

更新:谢谢你的答案。 对于那些在未来和好奇的人中搜索这个问题的人来说,这最终是我的解决方案:

 private void FormMain_Load(object sender, EventArgs e) { if (new FormLogin().ShowDialog(this) == DialogResult.Cancel) Close(); } 

和:

 private void buttonCancel_Click(object sender, EventArgs e) { Close(); } 

我发现当通过单击“X”关闭表单时,DialogResult会自动设置为“取消”,所以我需要做的就是Close()

如果您想要在最后一种情况下优雅地处理exception,那就没问题(虽然不是很好) – 只要它对您的应用程序来说是一种特殊情况。 否则,我将创建一个新方法,将表单显示为带有布尔值的对话框。 如果布尔值返回false(也就是说,用户关闭了表单),那么我将处理从那里关闭的应用程序(使用Application.Exit() )。

在我看来,从儿童关闭申请而不是告诉父母,这是非常糟糕的做法。 我唯一同意这一点是在FailFast情况下,非常罕见。


  • Application.Exit();

此方法停止所有线程上的所有正在运行的消息循环,并关闭应用程序的所有窗口。 此方法不会强制应用程序退出。 Exit方法通常在消息循环中调用,并强制Run返回。 要仅退出当前线程的消息循环,请调用ExitThread。

  • Application.ExitThread();

往上看。


  • Environment.Exit(1);

终止此过程并为底层操作系统提供指定的退出代码。


  • Process.GetCurrentProcess().Kill();

Kill强制终止进程,而CloseMainWindow仅请求终止。 当正在执行具有图形界面的进程时,其消息循环处于等待状态。 每次操作系统将Windows消息发送到进程时,都会执行消息循环。


  • SFTPClient.LDAPLoggedIn = false; Close();

在评论中澄清之后(将流程传递回父级并从那里处理),这是迄今为止最好的方法。


  • throw new Exception("User closed the form");

抛出调用进程的exception。 如果这是主线程,它将以非常丑陋的方式抛出exception。

终止应用程序的所有这些方法都过于复杂,它们在不同的场景中很有用,但不适用于您的场景。

您可以稍微重新设计您的应用程序,以更优雅的方式解决您的问题。 在main方法中,您可以显示登录表单,如果用户单击“取消”按钮,则只需退出main方法即可。 否则你会告诉你主要forms:

 class Program { static void Main(String[] args) { if ( Login.Show() ) { //Show main form for your application } //otherwise you simply return from Main method } } 

这种行为更加清晰简单。 在大多数情况下,主要forms太重量级,因此您的用户应该等待更多时间从您的应用程序中查看第一个窗口。

您应该使用Form.Close()而不是Application.Exit 。 正如MSDN文档所述,当您使用Application.Exit时,不会触发Form.CloseForm.Closing等事件。

感谢OP提供的解决方案,只是想添加它。

要关闭您的子表单并将其他内容返回给父级:

 this.DialogResult = DialogResult.OK; this.Close();