¿Cómo extiendo un método de eliminación de WinForm?
Pregunta
Recibo esta advertencia de FxCop:
" 'RestartForm' contiene el campo 'RestartForm.done' que es de tipo IDisposable: 'ManualResetEvent'. Cambie el método Dispose en 'RestartForm' para llamar a Dispose o Close en este campo. & Quot;
Ok, entiendo lo que esto significa y por qué esto es lo que hay que hacer ... Excepto que System.Windows.Forms.Form
no le permite anular .Close()
o .Dispose()
, entonces, ¿qué hacer? Actualmente estoy ejecutando con esta solución:
private void RestartForm_FormClosing(object sender, FormClosingEventArgs e)
{
done.Set();
done.Close();
}
Que 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 de hacerlo?
Solución
Debe anular el método Dispose
de Form
Normalmente, esto se reemplaza automáticamente en el archivo RestartForm.Designer.cs, por lo que deberá mover la disposición a su archivo de código para que pueda agregar el código que necesite sin que el diseñador lo vuelva a escribir.
En RestartForm.cs
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
// Dispose stuff here
}
base.Dispose(disposing);
}
Otros consejos
Yo uso este método :)
Image bgImage = Image.FromFile(workingDir + "\\" + button.BackgroundImage);
currentButton.Image = bgImage;
currentButton.Disposed += (Object sndr, EventArgs evnt) => bgImage.Dispose();
Si RestartForm extiende System.Windows.Forms.Form, debería poder anular Dispose (eliminación de bool). Debe implementar esto correctamente para su & Quot; RestartForm & Quot; clase 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);
}
Debe anular el método Dispose, este método proviene del Control clase base
protected override void Dispose(bool disposing)
{
if (disposing)
{
event.Dispose();
}
base.Dispose(disposing);
}