构建和处理表单的这种模式是否会导致资源泄漏?

时间:2013-11-07 00:05:56

标签: c# forms

在某些客户端计算机上,我收到此System.ComponentModel.Win32Exception: The operation completed successfully错误,这显然表示资源泄漏或达到每个进程10000个句柄的硬限制。

我正在查看代码来重构它,我用来创建窗口的模式是(简化)

class MyForm : Form
{
  public MyForm()
  {
    InitializeComponents()
  }

  //windows generated code
  public void InitializeComponents()
  {
      myButton = new System.Windows.Forms.Button();
      myButton.Click += new System.EventHandler(myButton1_Click);
  }

  private void button1_Click(object sender, EventArgs e)
  {
      Dispose();
  }
}

//this will be called many times throughout the programs lifecycle
Form myForm = new Form()
myForm.ShowDialog();

每次显示窗口时重建Button(实际上有很多组件)可能会导致句柄出现问题?我认为dispose意味着没有,但我正在努力寻找可能导致问题的其他代码部分。

2 个答案:

答案 0 :(得分:2)

您必须取消订阅任何订阅,否则它pins该实例,永远不会被垃圾收集,因为订阅仍处于活动状态。

答案 1 :(得分:1)

如果您没有将其显示为模态表单,则应该在表单上调用Close()而不是Dispose。 关闭将关闭表单,如果它不是模态形式,则自动处理。 如果表单是模态的,你仍然应该调用Close(),但之后也调用Dispose()。

你应该总是在你完成的表单上调用Close(),因为有很多Win32调用你要跳过,否则,这是Windows表单应用程序的正常部分&#39 ; s生命周期。