0

在某些客户端计算机上,我收到此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();

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

4

2 回答 2

2

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

于 2013-11-07T00:08:41.303 回答
1

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

您应该始终在已完成的表单上调用 Close(),因为您将跳过许多 Win32 调用,否则,这是 Windows 窗体应用程序生命周期的正常部分。

于 2013-11-07T00:10:46.297 回答