web-dev-qa-db-fra.com

Comment étendre une méthode Dispose d'une WinForm?

Je reçois cet avertissement de FxCop:

"'RestartForm' contient le champ 'RestartForm.done' de type IDisposable: 'ManualResetEvent'. Modifiez la méthode Dispose sur 'RestartForm' pour appeler Dispose ou Close dans ce champ."

Ok, je comprends ce que cela signifie et pourquoi c’est ce qui doit être fait ... Sauf que System.Windows.Forms.Form ne vous permet pas de remplacer .Close() ou .Dispose(), que faire? Actuellement, je cours avec cette solution:

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

Ce qui fonctionne comme prévu pour mon application ... Mais FxCop affiche toujours ce message. Suis-je couvert et puis-je l'ignorer en toute sécurité ou y a-t-il un autre moyen de le faire?

57
Matthew Scharley

Vous devez remplacer la méthode Dispose à partir de Form

En règle générale, cela est automatiquement remplacé dans le fichier RestartForm.Designer.cs. Vous devez donc déplacer l'élément dans votre fichier de code afin de pouvoir ajouter le code que vous devez ajouter sans qu'il soit réécrit par le concepteur.

Dans le RestartForm.cs

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

    // Dispose stuff here
  }

  base.Dispose(disposing);
}
95
heavyd

J'utilise cette méthode :)

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

Si RestartForm étend System.Windows.Forms.Form, vous devriez pouvoir remplacer Dispose (bool dispose). Vous devriez correctement implémenter ceci pour que votre classe "RestartForm" élimine vos IDisposables.

Cela devrait ressembler à:

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

Vous devez redéfinir la méthode Dispose, cette méthode provient de la classe Control base

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