63 votes

Comment étendre la méthode Dispose d'un WinForm ?

Je reçois cet avertissement de FxCop :

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

Ok, je comprends ce que cela signifie et pourquoi c'est ce qui doit être fait... Sauf System.Windows.Forms.Form ne vous permet pas d'outrepasser .Close() o .Dispose() alors que faire ? Actuellement, je fonctionne 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 sans risque, ou y a-t-il une autre façon de procéder ?

110voto

heavyd Points 8845

Vous devez remplacer l'option Dispose méthode de Form

En général, cette fonction est automatiquement remplacée dans le fichier RestartForm.Designer.cs. Vous devrez donc déplacer la disposition dans votre fichier de code afin de pouvoir ajouter le code dont vous avez besoin sans qu'il soit réécrit par le concepteur.

Dans le fichier RestartForm.cs

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

    // Dispose stuff here
  }

  base.Dispose(disposing);
}

13voto

Mark Seemann Points 102767

Jetez un coup d'œil à mon Comment éliminer les membres des formulaires Il devrait vous fournir toutes les options dans les moindres détails (surtout si vous lisez aussi les commentaires).

8voto

AlexTheo Points 2024

J'utilise cette méthode :)

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

2voto

womp Points 71924

Si RestartForm étend System.Windows.Forms.Form, vous devriez pouvoir surcharger Dispose(bool disposing). Vous devez implémenter correctement cette fonction pour votre classe "RestartForm" afin de disposer de vos IDisposables.

Ça devrait ressembler à ça :

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

0voto

Shay Erlichmen Points 23645

Vous devez surcharger la méthode Dispose, cette méthode provient du contrôle classe de base

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X