Como faço para estender método Dispose de um WinForm?
Pergunta
Estou recebendo este aviso de FxCop:
" 'RestartForm' contém campo 'RestartForm.done' que é do tipo IDisposable:. 'ManualResetEvent' Alterar o método Dispose em 'RestartForm' para chamar Dispose ou Fechar neste campo"
Ok, eu entendo o que isso significa e por que isso é o que precisa ser feito ... Exceto System.Windows.Forms.Form
não permitem substituir quer .Close()
ou .Dispose()
, então o que fazer? Atualmente eu estou correndo com esta solução:
private void RestartForm_FormClosing(object sender, FormClosingEventArgs e)
{
done.Set();
done.Close();
}
Que funciona como pretendido para a minha candidatura ... Mas FxCop ainda mostra esta mensagem. Am I cobertas e eu posso ignorá-la com segurança, ou há outra maneira que eu deveria estar fazendo isso?
Solução
Você precisa substituir o método Dispose
de Form
Normalmente, isso é automaticamente substituído no arquivo RestartForm.Designer.cs, portanto, será necessário para mover a dispor em seu arquivo de código para que você pode adicionar o código que você precisa adicionar sem que seja reescrito pelo designer.
Nos RestartForm.cs
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
// Dispose stuff here
}
base.Dispose(disposing);
}
Outras dicas
Eu uso este método:)
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, você deve ser capaz de substituir Dispose (bool disposing). Você deve implementar adequadamente esse para sua classe "RestartForm" de dispor de seus IDisposables.
Ele deve ser parecido:
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);
}
Você precisa substituir o método Dispose, este método vem do controle classe base
protected override void Dispose(bool disposing)
{
if (disposing)
{
event.Dispose();
}
base.Dispose(disposing);
}