C# WinForms在窗体之间切换内存问题
我目前有3个表格,一个主菜单,表格2和表格3。是否有一种打开和关闭表单的优化方法,因为当我在表单之间切换时,它们占用了内存,我可以在几分钟内快速切换到几GB的使用率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
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
}