2009-06-27 56 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();