Как расширить WinForm метод Dispose? - PullRequest
59 голосов
/ 27 июня 2009

Я получаю это предупреждение от FxCop:

"« RestartForm »содержит поле« RestartForm.done »с типом IDisposable:« ManualResetEvent ». Измените метод Dispose для« RestartForm », чтобы вызывать Dispose или Close для этого поля."

Хорошо, я понимаю, что это значит и почему это то, что нужно сделать ... За исключением того, что System.Windows.Forms.Form не позволяет вам переопределить либо .Close(), либо .Dispose(), так что делать? В настоящее время я работаю с этим решением:

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

Который работает как предназначено для моего приложения ... Но FxCop по-прежнему показывает это сообщение. Я застрахован и могу ли я спокойно проигнорировать это, или есть другой способ, которым я должен это делать?

Ответы [ 4 ]

99 голосов
/ 27 июня 2009

Вам необходимо переопределить метод Dispose из Form

Обычно это автоматически переопределяется в файле RestartForm.Designer.cs, поэтому вам нужно будет переместить удаление в ваш файл кода, чтобы вы могли добавить любой код, который вам нужно добавить, без перезаписи дизайнером. *

В RestartForm.cs

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

    // Dispose stuff here
  }

  base.Dispose(disposing);
}
8 голосов
/ 20 декабря 2011

Я использую этот метод:)

            Image bgImage = Image.FromFile(workingDir + "\\" + button.BackgroundImage);
            currentButton.Image = bgImage;
            currentButton.Disposed += (Object sndr, EventArgs evnt) => bgImage.Dispose();
2 голосов
/ 27 июня 2009

Если 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);
}
0 голосов
/ 27 июня 2009

Вам необходимо переопределить метод Dispose, этот метод происходит из базового класса Control

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