【问题标题】:Is this a memory leak? Winforms hiding and showing forms这是内存泄漏吗? Winforms 隐藏和显示表单
【发布时间】:2014-12-03 10:42:58
【问题描述】:

我正在使用以下代码隐藏一个表单并显示一个新表单(基本上,我想在两个表单之间切换)。但是每次我在任务管理器中按下 button2 或 button1 时,我的应用程序的内存使用量都会增加。每次单击按钮时,此内存使用量都会增加,并且直到 Application.Exit() 才会释放。这是某种内存泄漏吗?我是否错误地管理了我的表单?

非常感谢。

表格 1:

Form2 pform2;
private void button2_Click(object sender, EventArgs e)
{

    if (form2 != null)
    {
        pform2.Show();
    }
    else
    {
        pform2 = new Form2();
        pform2.Show();
        this.Hide();
    }
    this.Hide();

表格 2

Form1 pform1;
private void button1_Click(object sender, EventArgs e)
{

    if (form1 != null)
    {
        pform1.Show();
    }
    else
    {
        pform1 = new Form1();
        pform1.Show();
        this.Hide();
    }
    this.Hide();

【问题讨论】:

  • 使用任务管理器查找内存泄漏的人不能再使用电脑了。
  • @Dennis 简单地看一下内存消耗就足够了......
  • @Dennis 非常有用的评论,谢谢。

标签: c# .net winforms forms memory-leaks


【解决方案1】:

如果您使用调试器,您会清楚地看到发生了什么。 问题是每次单击按钮时都会创建Form1Form2 的新实例。字段pform1 例如。然后pform2 每次都为空,因此单击按钮时会创建一个新实例。

我认为您正在寻找这样的东西:

public class Main
{
  public Main()
  {
    var form = new Form1();
    form.ShowDialog();
  }
}

public class Form1 : Form
{
  private readonly Form2 _form2;

  public Form1()
    : this(null)
  {
    _form2 = new Form2(this);
  }

  public Form1(Form2 form2)
  {
    _form2 = form2;
    var button = new Button();
    button.Click += ButtonOnClick;
    Controls.Add(button);
  }

  private void ButtonOnClick(object sender, EventArgs eventArgs)
  {
    this.Hide();
    _form2.Show();
  }
}

public class Form2 : Form
{
  private readonly Form1 _form1;

  public Form2(Form1 form2)
  {
    _form1 = form2;
    var button = new Button();
    button.Click += ButtonOnClick;
    Controls.Add(button);
  }

  private void ButtonOnClick(object sender, EventArgs eventArgs)
  {
    this.Hide();
    _form1.Show();
  }
}

【讨论】:

  • 谢谢,我只是想确定我的程序是否存在内存泄漏,并且您的回答被证明是有用的 :)
  • 介意我问什么吗? Visual Studio 告诉我,IFs 条件中的 form2 和 form1 在当前上下文中不存在。
  • @Aturo 我已经将我的示例更新为一个完整的示例,您可以像它一样运行它
  • 非常感谢!! :)
  • 使用您的代码,每当您单击按钮时,它仍然会增加越来越多的 RAM 使用量……但我想我不应该相信任务管理器。 :)
【解决方案2】:

根据您提供的代码:您不是在表单之间“切换”,您每次都在创建新表单

假设您在Form1 中并按下您的按钮。然后pform2 将被创建并显示,但由于您没有将Form1 实例传递给pform2 - 它在pform1 中将具有空值,因此当您按下该表单中的按钮时,new Form1 的实例将被创建并显示等等.....

【讨论】:

  • 非常感谢!如果我可以将两个帖子标记为答案,我也会标记你的。真的很有用:)
  • @Andy_Korneyev 看来我需要 15 点声望(我还没有)对不起 :(
猜你喜欢
  • 2011-02-20
  • 2013-08-12
  • 1970-01-01
  • 2011-05-12
  • 2013-01-08
  • 2013-11-12
  • 2015-05-04
相关资源
最近更新 更多