2009-06-27 8 views
48

Me estoy haciendo esta advertencia de FxCop:¿Cómo extiendo el método de eliminación de WinForm?

" 'RestartForm' contiene campo 'RestartForm.done' que es de tipo IDisposable:. 'ManualResetEvent' Cambiar el método Dispose en 'RestartForm' para llamar a Dispose o Cerrar 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 o bien .Close() o .Dispose(), así que lo que hay que hacer? Actualmente me 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 en que debería estar haciendo esto?

+2

También puede suscribirse al evento Dispuesta en su constructor, si no quieres tocar diseñador de código generado. – arbiter

Respuesta

86

Es necesario reemplazar el método de DisposeForm

Normalmente, esto se anula automáticamente en el archivo RestartForm.Designer.cs, por lo que tendrá que mover el deseche en su archivo de código para que pueda agregar el código que necesite agregar sin que el diseñador lo reescriba.

En los RestartForm.cs

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

    // Dispose stuff here 
    } 

    base.Dispose(disposing); 
} 
+5

Esto es exactamente lo que me faltaba ... Ni siquiera pensé en verificar si el diseñador lo estaba poniendo en su código autogenerado ... Explica por qué no estaba en la lista de anulación, ya estaba implementado, simplemente no ¡por mi! –

+0

¿Dónde pongo mi material de disposición en caso de que 'eliminación' y 'componentes! = Null' se evalúen en la misma línea? P.ej. 'if (descartando && (components! = null))' (predeterminado para vs2013) –

+1

@firsttimer, la lógica es la misma. Necesita mover el método fuera de su archivo de diseñador y luego romper las condiciones. tu código debería verse como mi ejemplo anterior cuando hayas terminado. – heavyd

0

se debe redefinir el método Dispose, este método comes from the Control clase base

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

Si RestartForm extiende System.Windows.Forms.Form, usted debería ser capaz de anular Dispose (bool eliminación). Debe implementar esto adecuadamente para su clase "RestartForm" para deshacerse de sus IDisposables.

Debe quedar como:

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

que utiliza este método :)

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