完全关闭C#中的应用程序只是不起作用

时间:2017-04-22 18:41:11

标签: c# winforms

我正在编写一个简单的游戏,我的功能基本上应该退出应用程序,或者更确切地关闭当前在C#中打开的所有内容(我使用Windows窗体)。

private void ExitApp()
{
    Application.Exit();
}

但是,什么都行不通。我尝试过使用Environment.Exit(0)Application.Exit,尝试使用for循环关闭每个表单,但它只是不起作用。我注意到的是,即使我按下X按钮,解决方案也不会关闭,但是后台似乎有些东西在运行,我不知道是什么。针对类似问题浏览了Stackoverflow论坛,浏览了其他论坛,搜索了几天,但似乎没有任何帮助。

这是打开更多表单的代码:

Podešavanja p = new Podešavanja();

private void Settings_FormClosing(object sender, FormClosingEventArgs e)
{
        this.Close();
        Menu m = new Menu();
        m.Show();
}

private void button1_Click(object sender, EventArgs e)
{
        this.Close();
        Menu m = new Menu();
        m.Show();
}

SettingsFormClosing事件实际上只为我打开一个新表格,而不关闭前一个表格,为什么,我不知道。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

问题是您的表单都在同一个线程上运行。看看你的Program.cs文件。看看它如何调用Application.Run(New Form1())?这是您的申请表最初在申请线程上运行的地方。

所以我们在这里遇到的问题是:你正在试图关闭你的第二张表格。假设您的单个表单上有一个按钮控件。现在假设您试图告诉您的应用程序您希望关闭窗口表单,但希望按钮保持活动状态并且打开 - 疯狂吧?那么你想要做的事情本质上是一回事 - 请注意,我假设你不是多线程的。您的Form1托管您的Form2实例,因此如果处置Form1,您将无法运行Form2。我能想到的最好的方法,至少在我的头脑中,你需要在Program.cs中创建一个递归调用,并告诉它是否需要在它真正退出之前运行一个新的Form。这充其量是有问题的,但它可能就足够了。

所以让我们修改我们的Program.cs然后:

static class Program
{
    //This is where we set the current form running -- or to be run.
    static Form CurrentForm;

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        //Obviously, Form 1 starts everything so we hardcode that here on startup.
        CurrentForm = new Form1();
        //Then call our Run method we created, which starts the cycle.
        Run();
    }

    //This runs the current form
    static void Run()
    {
        //Tell our program to run this current form on the application thread
        Application.Run(CurrentForm);
        //Once the form OFFICIALLY closes it will execute the code below
        //Until that point, imagine Application.Run being stuck there
        if(CurrentForm != null && CurrentForm.IsDisposed == false)
        {
            //If our current form is NOT null and it is NOT disposed,
            //Then that means the application has a new form to display
            //So we will recall this method.
            Run();
        }
    }

    //This method is what we will call inside our forms when we want to
    //close the window and open a new one.
    public static void StartNew(Form form)
    {
        //Close the current form running
        CurrentForm.Close();
        //Set the new form to be run
        CurrentForm = form;

        //Once all this is called, imagine the program now 
        //Releasing Application.Run and executing the code after
    }
}

好的,如果你绕过它,那么关闭并打开一个新表格是件小事。我们只需在按钮点击事件上打开新表单。

在Form1.cs中:

    private void OpenForm2_Click(object sender, EventArgs e)
    {
        Program.StartNew(new Form2());
    }

在Form2.cs中

    private void OpenForm1_Click(object sender, EventArgs e)
    {
        Program.StartNew(new Form1());
    }

我将重申,这种方法是值得怀疑的......但它可能足以满足您的需求。无论类别或形式如何,它都可以通过您的应用程序进行超级重复使用。