代码之家  ›  专栏  ›  技术社区  ›  Nobody

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

  •  13
  • Nobody  · 技术社区  · 15 年前

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

    但似乎有几种不同的方法来关闭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()

    4 回复  |  直到 9 年前
        1
  •  12
  •   Chris Marisic    9 年前

    如果您希望在最后一个案例中优雅地处理异常,那么 好啊 (不过不太好)-只要你的申请是例外情况。否则,我将创建一个新方法,将窗体显示为一个带有布尔值的对话框。如果布尔值返回false(aka,用户关闭表单),那么我将处理从那里关闭的应用程序(使用 Application.Exit() )

    在我看来,关闭孩子的申请而不是告诉家长是非常糟糕的做法。我唯一一次同意这一点是在 FailFast 情况非常罕见。


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

    见上文。


    终止此进程并为基础操作系统提供指定的退出代码。


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


    • SFTPClient.LDAPLoggedIn = false; Close();

    在注释中澄清之后(将流返回给父级并从父级处理),这是迄今为止最好的方法。


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

    向调用进程引发异常。如果这是主线程,它将以非常难看的方式抛出异常。

        2
  •  4
  •   Sergey Teplyakov    15 年前

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

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

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

    这种行为更加清晰和简单。而且在大多数情况下,主窗体太杂,所以用户应该等待更多的时间从应用程序中看到第一个窗口。

        3
  •  2
  •   Kyle Rosendo    15 年前

    你应该使用 Form.Close() 而不是 Application.Exit . 如msdn文档所述,事件 Form.Close Form.Closing 使用时不要开火 Application.Exit .

        4
  •  1
  •   WhoIsRich    14 年前

    感谢OP提供的解决方案,只想添加到其中。

    关闭子窗体并将除“取消”以外的内容返回给父窗体:

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