【问题标题】:Application.Exit Isn't closing my program, any alternatives?Application.Exit 没有关闭我的程序,还有其他选择吗?
【发布时间】:2016-11-30 15:02:21
【问题描述】:

所以在我的表单构造函数中,我检查了一个参数。如果我得到两个特殊参数之一,那么我只想注册/注销我的服务器并关闭程序。我不希望在这些情况下加载表单。但是,就目前而言,以下代码成功注册/取消注册服务器,但它不会像我想要的那样立即杀死我的应用程序。还有其他命令可以这样做吗?或者也许有更好的方法来做我想做的事?

我的代码:

    public Form1()
    {
        InitializeComponent();
        instance = this;
        fillMeasView();

        string[] args = Environment.GetCommandLineArgs();
        if (args.Length > 1)
        {
            switch (args[1])
            {
                case "register":
                    try
                    {
                        slikServer1.RegisterServer();
                        MessageBox.Show("Server registered successfully!");
                    }
                    catch(Exception ex)
                    {
                        MessageBox.Show("Error: Could not register server." + "\nAdditional Information: " + ex.Message, "Registering Server Failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    Application.Exit();
                    break;
                case "unregister":
                    try
                    {
                        slikServer1.UnregisterServer();
                        MessageBox.Show("Server unregistered successfully!");
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Error: Could not unregister server." + "\nAdditional Information: " + ex.Message, "Unregistering Server Failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    Application.Exit();
                    break;
                default:
                    MessageBox.Show("This is the cmd line arg:" + args[1]);
                    break;
            }
        }

    }

【问题讨论】:

  • 将该代码移动到Main 方法(应用程序入口点),并且根本不显示表单,而是退出任何内容。
  • @Sinatr 你是说要创建一个主目录?这会在程序起点方面增加歧义,不是吗?
  • 你已经拥有它......某处;)不要创建新的,使用/修改现有的。它甚至还有特殊版本:见this answer
  • @J.Doe 将检查放在程序起点 (main)。然后仅在需要时加载表单

标签: c# winforms command-line-arguments exit kill-process


【解决方案1】:

你想要:

Environment.Exit(0);

【讨论】:

  • 该命令究竟做了什么?我现在就试一试,谢谢
  • @J.Doe 它会终止进程并分配 ExitCode = 0
  • "终止此进程并向操作系统返回退出代码。" - MSDN
  • 不,仍然不适合我,form1 似乎仍在加载。编辑:忘记将其应用于注册服务器命令。只是注销了。现在可以正常工作了,谢谢先生:)
【解决方案2】:

您可以使用Environment.Exit(0)。非零退出代码表示错误。

终止此进程并为底层操作系统提供指定的退出代码。这是您在使用控制台应用程序时要调用的代码。

查看文档时,与Application.Exit() 的区别变得清晰。

通知所有消息泵它们必须终止,然后在处理完消息后关闭所有应用程序窗口。

但要小心Environment.Exit(),因为它会立即终止进程。您可能想调查为什么Application.Exit() 无法关闭您的应用程序。

【讨论】:

  • 当我使用 Environment.Exit 时仍然为我加载 form1 :(
【解决方案3】:

您并不真的希望在表单构造函数中使用此代码。相反,找到您的入口点(通常是 Program.cs 文件中的静态 Main 方法),并将其放在那里。

Application.Exit 已经是一个不好的信号——它表明你并不真正知道你当时想要退出什么。它在您的情况下不起作用的原因是还没有应用程序可以退出 - winforms 应用程序的通常启动方式如下所示:

Application.Run(new Form1());

由于您在表单构造函数中,Application.Run 还没有运行,所以没有要退出的消息循环(这是 Application.Exit 所做的)。

您还可以从入口点直接访问命令行参数 - 它是 Main 方法的参数。在那里做你所有的决定,只有当你想实际运行 GUI 应用程序时,才做Application.Run。否则,只需从Main 返回,您的应用程序就会结束(前提是您当时没有启动任何仍处于活动状态的前台线程)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多