Come posso estendere il metodo Dispose di WinForm?
Domanda
Ricevo questo avviso da FxCop:
" 'RestartForm' contiene il campo 'RestartForm.done' di tipo IDisposable: 'ManualResetEvent'. Modificare il metodo Dispose su 'RestartForm' per chiamare Dispose o Close in questo campo. & Quot;
Ok, capisco cosa significa e perché questo è ciò che deve essere fatto ... Tranne System.Windows.Forms.Form
non ti consente di sostituire .Close()
o .Dispose()
, quindi cosa fare? Attualmente sto correndo con questa soluzione:
private void RestartForm_FormClosing(object sender, FormClosingEventArgs e)
{
done.Set();
done.Close();
}
Che 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?
Soluzione
Devi sovrascrivere il metodo Dispose
da Form
In genere, questo viene automaticamente sovrascritto nel file RestartForm.Designer.cs, quindi sarà necessario spostare lo smaltimento nel file di codice in modo da poter aggiungere qualsiasi codice necessario senza che venga riscritto dal designer.
In RestartForm.cs
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
// Dispose stuff here
}
base.Dispose(disposing);
}
Altri suggerimenti
Uso questo metodo :)
Image bgImage = Image.FromFile(workingDir + "\\" + button.BackgroundImage);
currentButton.Image = bgImage;
currentButton.Disposed += (Object sndr, EventArgs evnt) => bgImage.Dispose();
Se RestartForm estende System.Windows.Forms.Form, dovresti essere in grado di sovrascrivere Dispose (eliminazione bool). Dovresti implementarlo correttamente per il tuo & Quot; RestartForm & Quot; classe per smaltire i tuoi IDisposable.
Dovrebbe apparire come:
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);
}
Devi sovrascrivere il metodo Dispose, questo metodo proviene dal controllo classe base
protected override void Dispose(bool disposing)
{
if (disposing)
{
event.Dispose();
}
base.Dispose(disposing);
}