C# 方法this.hide()与this.close()的比较

C# 方法this.hide()与this.close()的比较,c#,winforms,C#,Winforms,我的c#windows窗体应用程序有5个窗体,我正在逐个显示它们。当用户单击“下一步”按钮时,我给出的代码是: new Form1().Show(); this.Hide(); 但是,我不希望隐藏当前表单。我想关闭/处置它,这样它就不会占用内存。我想释放它的资源,如图像和变量使用尽快我与它完成。 为此,我尝试实施: new Form1().Show(); this.Close(); //Form 2 但这只是关闭了这两种形式。 我甚至尝试交换上述两行的位置: this.Close();

我的c#windows窗体应用程序有5个窗体,我正在逐个显示它们。当用户单击“下一步”按钮时,我给出的代码是:

new Form1().Show();
this.Hide();
但是,我不希望隐藏当前表单。我想关闭/处置它,这样它就不会占用内存。我想释放它的资源,如图像和变量使用尽快我与它完成。 为此,我尝试实施:

new Form1().Show();
this.Close();    //Form 2
但这只是关闭了这两种形式。 我甚至尝试交换上述两行的位置:

this.Close();
new Form1().Show();
但这也有同样的作用

如何在使用完一个表单后立即释放该表单的资源?因为当我尝试使用以下方法重新打开表单2时,我的程序抛出内存不足异常:

new Form2().Show();
this.Hide();

关闭程序在其主功能中启动的窗体将关闭应用程序,一个想法是拥有一个父窗体并使其成为主窗体,并且永远不要关闭它,如果需要,这可以是一个隐藏窗体

我很久以前就不使用Windows窗体了,但在本页上找到了您所获得的行为背后的原因:

通常,应用程序的主函数调用此方法并 将应用程序的主窗口传递给它。此方法添加了一个 已关闭事件的mainForm参数的事件处理程序。这个 事件处理程序调用ExitThread来清理应用程序


在这个问题上,也讨论了同样的问题,您可以在一个新的
线程中启动
新表单
,并创建一个新的消息循环

当主消息循环关闭时,应用程序退出。在Windows窗体中,当调用Exit方法时,此循环关闭

有关更多信息,请参阅


另一种方法是自己管理应用程序上下文。下面是一个小演示:

 [STAThread]
 static void Main()
 {
     Application.EnableVisualStyles();
     Application.SetCompatibleTextRenderingDefault(false);
     using (var myApplicationContext = new MyApplicationContext(new Form1()))
     {
        Application.Run(myApplicationContext);
     }
 }
您可以通过以下方式定义定制的
ApplicationContext

public class MyApplicationContext : ApplicationContext
{
    public MyApplicationContext(Form mainForm)
        :base(mainForm)
    {
    }

    protected override void OnMainFormClosed(object sender, EventArgs e)
    {
        if (Form.ActiveForm != null)
        {
           this.MainForm = Form.ActiveForm;
        }
        else
        {
           base.OnMainFormClosed(sender, e);
        }
    }
}
现在,您可以在
按钮上执行以下操作。单击
事件处理程序:

var f = new Form();
f.Show();
this.Close();
应用程序将继续运行。基本上,这样可以在至少有一个活动表单的情况下保持应用程序的活动状态

注意尚未测试它,但它应该可以工作。

默认情况下,C#Forms应用程序在Program.Main()方法中创建一个“root”表单,并将其传递给application.Run()方法。关闭此窗体后,您的程序将退出


但是,您可以通过使用不同的应用程序来更改此行为。Run()重载。只是不要将表单实例传递给Run()。相反,在调用Application.Run()之前显示表单,然后稍后(当您最终希望程序退出时)使用Application.ExitThread()方法告诉应用程序类您已经准备好关闭应用程序。

我不确定它是否适合您。但是当我在处理登录表单时遇到同样的问题。。。我只是使用ShowDialog()而不是Show(),(对我来说,它解决了这个问题),就像:

        this.Hide();
        MainForm MForm = new MainForm();
        MForm.ShowDialog();
        this.Close();

如果你关闭主窗体,你的应用程序将关闭…将选项(在“我的项目”下)设置为“在最后一个窗口关闭时退出”(或其他任何选项)。@minitech我认为此选项仅在VB.NET中可用,在C中,如果可能的话,你必须自己实现它。
        this.Hide();
        MainForm MForm = new MainForm();
        MForm.ShowDialog();
        this.Close();