web-dev-qa-db-ja.com

WinFormのDisposeメソッドを拡張するにはどうすればよいですか?

私は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はまだこのメッセージを表示します。私はそれをカバーして安全に無視できますか、またはこれを行うべき別の方法がありますか?

59

DisposeFormメソッドをオーバーライドする必要があります

通常、これはRestartForm.Designer.csファイルで自動的にオーバーライドされるため、デザイナーが書き直さずに追加する必要のあるコードを追加できるように、コードファイルに破棄を移動する必要があります。

RestartForm.csで

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

    // Dispose stuff here
  }

  base.Dispose(disposing);
}
101
heavyd

私はこの方法を使用します:)

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

RestartFormがSystem.Windows.Forms.Formを拡張する場合、Dispose(bool disposing)をオーバーライドできます。 IDisposablesを破棄するには、RestartFormクラスにこれを適切に実装する必要があります。

次のようになります。

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);
}
2
womp

Disposeメソッドをオーバーライドする必要があります。このメソッド Controlから取得 基本クラス

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