方法this.hide()vs this.close()

时间:2014-10-18 20:24:10

标签: c# winforms

我的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();

5 个答案:

答案 0 :(得分:4)

您可以在新的NewForm中启动thread并创建新的消息循环

  

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

有关详细信息,请参阅here

var th = new Thread(() => Application.Run(new NewForm()));
th.SetApartmentState(ApartmentState.STA); // Deprecation Fix
th.Start();

this.Close();

答案 1 :(得分:2)

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

 [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);
        }
    }
}

现在,您可以在Button.Click事件处理程序上执行以下操作:

var f = new Form();
f.Show();
this.Close();

应用程序将继续运行。基本上这种方式可以使应用程序保持活动状态,同时至少有一个活动表单。

注意 尚未对其进行测试,但它应该有效。

答案 2 :(得分:1)

关闭程序在其主函数中启动的表单将关闭应用程序,一个想法是拥有一个父表单并使其成为主表单,并且永远不关闭它,如果你愿意,这可以是一个隐藏的表单。 / p>

我很久以前不使用Windows窗体,但在此页面上找到了您获得的行为背后的原因:
http://msdn.microsoft.com/en-us/library/ms157902(v=vs.110).aspx

  

通常,应用程序的主要功能调用此方法和   将应用程序的主窗口传递给它。这个方法增加了一个   Closed事件的mainForm参数的事件处理程序。该   事件处理程序调用ExitThread来清理应用程序。

同样在这个问题上How do I prevent the app from terminating when I close the startup form?讨论了同样的问题

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

默认情况下,C#Forms应用程序会创建一个" root"在Program.Main()方法中形成并将其传递给Application.Run()方法。当此表格关闭时,您的程序将退出。

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