2009-06-27 57 views
48

我从FxCop的得到这样的警告:如何扩展WinForm的Dispose方法?

“‘RestartForm’包含字段‘RestartForm.done’这是IDisposable的类型:‘ManualResetEvent的’更改对‘RestartForm’Dispose方法调用Dispose或关闭在这个领域。“

好吧,我明白这意味着什么,以及为什么这是需要做什么......除了System.Windows.Forms.Form不允许您覆盖要么.Close().Dispose(),还等什么呢?目前我正在运行这个解决方案:

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

它的工作原理为我的应用程序...但FxCop仍然显示此消息。我是否覆盖了,我可以放心地忽略它吗,还是有另一种方法我应该这样做?

+2

您也可以订阅到设置事件在你的构造函数,如果你不想要触摸设计器生成的代码。 – arbiter 2009-06-27 10:38:00

回答

86

你需要从Form

通常,这是在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); 
} 
+5

这正是我所错过的......我甚至都没有想过要检查设计者是否将它放在自动生成的代码中......解释为什么它不在override列表中,它已经实现,只是没有由我! – 2009-06-27 06:16:21

0

你需要重写Dispose方法,这种方法comes from the Control基类

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

如果RestartForm延伸System.Windows.Forms.Form中,你应该能够覆盖的Dispose(BOOL处置)。你应该为你的“RestartForm”类正确地实现这个来处理你的IDisposables。

它应该看起来像:

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); 
} 
6

我用这个方法:)

  Image bgImage = Image.FromFile(workingDir + "\\" + button.BackgroundImage); 
      currentButton.Image = bgImage; 
      currentButton.Disposed += (Object sndr, EventArgs evnt) => bgImage.Dispose();