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

Nob*_*ody 13 .net c# winforms

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

但似乎有几种不同的方法可以关闭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();
}
Run Code Online (Sandbox Code Playgroud)

和:

private void buttonCancel_Click(object sender, EventArgs e)
{
    Close();
}
Run Code Online (Sandbox Code Playgroud)

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

Kyl*_*ndo 12

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

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


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

往上看.


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


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


  • SFTPClient.LDAPLoggedIn = false; Close();

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


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

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