C# 如何扩展WinForm';什么样的处理方法?

C# 如何扩展WinForm';什么样的处理方法?,c#,winforms,dispose,fxcop,C#,Winforms,Dispose,Fxcop,我从FxCop收到以下警告: “RestartForm”包含IDisposable类型的字段“RestartForm.done:“ManualResetEvent”。请更改“RestartForm”上的Dispose方法以调用此字段上的Dispose或Close。” 好的,我明白这意味着什么,为什么这是需要做的。。。除了System.Windows.Forms.Form不允许您重写.Close()或.Dispose(),该怎么办?目前我正在运行此解决方案: private void Re

我从FxCop收到以下警告:

“RestartForm”包含IDisposable类型的字段“RestartForm.done:“ManualResetEvent”。请更改“RestartForm”上的Dispose方法以调用此字段上的Dispose或Close。”

好的,我明白这意味着什么,为什么这是需要做的。。。除了
System.Windows.Forms.Form
不允许您重写
.Close()
.Dispose()
,该怎么办?目前我正在运行此解决方案:

    private void RestartForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        done.Set();
        done.Close();
    }

按照我的应用程序的预期工作。。。但FxCop仍然显示了这一信息。我是否被覆盖并且可以安全地忽略它,或者是否有其他方法可以做到这一点?

您需要重写Dispose方法,这个方法基类

protected override void Dispose(bool disposing)
{
  if (disposing)
  {
    event.Dispose();
  }
  base.Dispose(disposing);
}

如果RestartForm扩展了System.Windows.Forms.Form,您应该能够覆盖Dispose(bool disposing)。您应该为“RestartForm”类正确实现这一点,以处理IDisTables

它应该是这样的:

public override Dispose(bool disposing)
{
   if (disposing)
   {
       // Dispose was called from user code. Dispose of managed resources here.
       done.Dispose();
   }

   // Dispose of unmanaged resources here, and invoke base dispose.
   base.Dispose(disposing);
}

您需要从
表单

通常,这会在RestartForm.Designer.cs文件中自动覆盖,因此您需要将dispose移到代码文件中,以便可以添加需要添加的任何代码,而无需设计器重写

在RestartForm.cs中

protected override void Dispose(bool disposing)
{
  if (disposing)
  {
    if (components != null)
    {
      components.Dispose();
    }

    // Dispose stuff here
  }

  base.Dispose(disposing);
}
我用这个方法:)


这正是我所缺少的。。。我甚至没想过要检查设计师是否把它放在自动生成的代码中。。。解释了为什么它不在覆盖列表中,它已经实现了,只是不是由我实现的!如果
disposing
组件!=null
是否在同一行计算?例如,
如果(disposing&&(components!=null))
(vs2013的默认值)@firsttimer,则逻辑相同。您需要将该方法移出设计器文件,然后分解条件。完成后,您的代码应该与上面的示例类似。如果您不想接触设计器生成的代码,您还可以在构造函数中订阅Disposed event。这不就是给您留下一个事件接收器来取消订阅,让您面临资源泄漏,因为您已经处理了表单吗?不,这不重要。如果订阅的类没有其他正在运行的类绑定到它,它将自动解除绑定。
            Image bgImage = Image.FromFile(workingDir + "\\" + button.BackgroundImage);
            currentButton.Image = bgImage;
            currentButton.Disposed += (Object sndr, EventArgs evnt) => bgImage.Dispose();