c# winforms dispose fxcop

c# - ¿Cómo extiendo un método de eliminación de WinForm?



winforms dispose (4)

Debe anular el método Dispose, este método proviene de la clase base Control

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

Recibo esta advertencia de FxCop:

"''RestartForm'' contiene el campo ''RestartForm.done'' que es del tipo IDisposable: ''ManualResetEvent''. Cambie el método Dispose en ''RestartForm'' para llamar a Dispose o Close en este campo."

Ok, entiendo lo que esto significa y por qué esto es lo que hay que hacer ... Excepto System.Windows.Forms.Form no le permite anular .Close() o .Dispose() , entonces, ¿qué hacer? Actualmente estoy corriendo con esta solución:

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

Lo cual funciona según lo previsto para mi aplicación ... Pero FxCop todavía muestra este mensaje. ¿Estoy cubierto y puedo ignorarlo con seguridad, o hay otra forma en que debería estar haciendo esto?


Debe anular el método de Form del Form

Por lo general, esto se reemplaza automáticamente en el archivo RestartForm.Designer.cs, por lo que deberá mover el desecho en su archivo de código para que pueda agregar el código que necesite agregar sin que el diseñador lo reescriba.

En el RestartForm.cs

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


Si RestartForm extiende System.Windows.Forms.Form, debe poder anular Dispose (bool disposing). Debe implementar esto adecuadamente para su clase "RestartForm" para deshacerse de sus IDisposables.

Debería verse así:

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


Yo uso este método :)

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