2009-06-27 6 views
48

sto ottenendo questo avvertimento da FxCop:Come estendere il metodo Dispose di WinForm?

" 'RestartForm' contiene campo 'RestartForm.done' che è di tipo IDisposable:. 'ManualResetEvent' Cambiare il metodo Dispose su 'RestartForm' a chiamare Dispose o Chiudi su questo campo. "

Ok, ho capito cosa significa e perché questo è ciò che deve essere fatto ... Tranne System.Windows.Forms.Form non consente di sovrascrivere o .Close() o .Dispose(), quindi cosa fare? Attualmente sono in esecuzione con questa soluzione:

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

Quale funziona come previsto per la mia applicazione ... Ma FxCop mostra ancora questo messaggio. Sono coperto e posso tranquillamente ignorarlo, o c'è un altro modo in cui dovrei farlo?

+2

È inoltre possibile iscriversi alla manifestazione Smaltiti nel costruttore, se non si vuole toccare progettista codice generato. – arbiter

risposta

86

È necessario eseguire l'override del metodo Dispose da Form

In genere questo viene sostituito automaticamente nel file RestartForm.Designer.cs, quindi sarà necessario spostare il disponi nel tuo file di codice in modo che tu possa aggiungere qualsiasi codice tu debba aggiungere senza essere riscritto dal progettista.

Negli RestartForm.cs

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

    // Dispose stuff here 
    } 

    base.Dispose(disposing); 
} 
+5

Questo è esattamente quello che mi mancava ... Non pensavo nemmeno di controllare se il progettista lo stava inserendo nel suo codice generato automaticamente ... Spiega perché non era nell'elenco di override, era già implementato, solo non da me! –

+0

Dove inserisco le mie merci in caso in cui 'disposing' e' components! = Null' vengano valutati sulla stessa riga? Per esempio. 'if (disposing && (components! = null))' (valore predefinito per vs2013) –

+1

@firsttimer, la logica è la stessa. È necessario spostare il metodo dal file di progettazione e quindi suddividere le condizioni. il tuo codice dovrebbe apparire come il mio esempio sopra quando hai finito. – heavyd

0

È necessario eseguire l'override del metodo Dispose, questo metodo comes from the Control classe base

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

Se RestartForm estende System.Windows.Forms.Form, si dovrebbe essere in grado di eseguire l'override Dispose (bool smaltimento). Dovresti implementare correttamente questo per la tua classe "RestartForm" per smaltire i tuoi IDisposables.

Esso dovrebbe essere simile:

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

Io uso questo metodo :)

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