C# WinForms在窗体之间切换内存问题

C# WinForms在窗体之间切换内存问题,c#,.net,winforms,C#,.net,Winforms,我目前有3个表格,一个主菜单,表格2和表格3。是否有一种打开和关闭表单的优化方法,因为当我在表单之间切换时,它们占用了内存,我可以在几分钟内快速切换到几GB的使用率 private void button2_Click(object sender, EventArgs e) { this.Hide(); NewForm NewForm = new NewForm(); NewF

我目前有3个表格,一个主菜单,表格2和表格3。是否有一种打开和关闭表单的优化方法,因为当我在表单之间切换时,它们占用了内存,我可以在几分钟内快速切换到几GB的使用率

   private void button2_Click(object sender, EventArgs e)
        {
            this.Hide();
            NewForm NewForm = new NewForm();
            
            NewForm.ShowDialog();
            this.Close();
            this.Dispose();
我发现如果注释掉这个。隐藏我的表单实际上并没有关闭。打开新表单时,我如何关闭表单?

您可能正在使用ShowDialog阻止应用程序在原始主表单关闭时退出

另一种方法是使用接收消息的的重载

然后,您可以编写自己的应用程序上下文,并告诉应用程序仅在没有其他表单打开时退出。这将允许您从ShowDialog切换到Show。这个小改动意味着旧表单将被处理,因为代码在显示后继续执行

回到ApplicationContext类中,我们可以连接事件并检查中打开的表单的数量,让我们知道何时所有表单都已关闭,是时候关闭应用程序了

因此,您的program.cs将更改为:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MyAppContext(new Form1()));
    }
}

public class MyAppContext : ApplicationContext
{
    public MyAppContext(Form startingForm)
    {
        startingForm.Show();
        Application.Idle += Application_Idle;
    }

    private void Application_Idle(object sender, EventArgs e)
    {
        if (Application.OpenForms.Count == 0)
        {
            Application.Exit();
        }
    }

}
所有这些就绪后,一旦最后一个表单关闭,应用程序将自动关闭,旧表单应该得到适当的处理


不过,请记住,GC为您管理内存……它可能会决定保留该内存,以便将来更快地加载。这种方法只是解决了由于ShowDialog正在停止执行而没有命中Dispose调用的问题。

看起来您每次单击都在创建一个新表单。尝试只创建一个实例,并动态隐藏/显示它;因为它是模态的,所以它会阻止它后面的代码,所以在关闭NewForm之前它不会运行这些代码?你确定确实有问题吗??GC很可能认为没有理由做任何事情;你也不应该。。
private void button1_Click(object sender, EventArgs e)
{
    Form2 f2 = new Form2();
    f2.Show(); // make sure you "Show()" the new form BEFORE disposing of the current one below
    this.Dispose(); // dispose of the current form
}