Как расширить метод WinForm Dispose?
Я получаю это предупреждение от FxCop:
"RestartForm" содержит поле "RestartForm.done", которое имеет тип IDisposable: "ManualResetEvent". Измените метод Dispose на "RestartForm", чтобы вызвать Dispose или Close в этом поле."
Хорошо, я понимаю, что это значит и почему это нужно сделать... За исключением System.Windows.Forms.Form
не позволяет переопределить либо .Close()
, либо .Dispose()
, так что делать? В настоящее время я запускаю это решение:
private void RestartForm_FormClosing(object sender, FormClosingEventArgs e)
{
done.Set();
done.Close();
}
Что работает для моего приложения... Но FxCop все еще показывает это сообщение. Я покрыл и могу ли я смело игнорировать его, или есть ли другой способ, которым я должен это делать?
Ответы
Ответ 1
Вам нужно переопределить метод Dispose
из Form
Как правило, это автоматически переопределяется в файле RestartForm.Designer.cs, поэтому вам нужно будет переместить утилиту в свой файл кода, чтобы вы могли добавить любой код, который вам нужно добавить, не переписывая конструктор.
В RestartForm.cs
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
// Dispose stuff here
}
base.Dispose(disposing);
}
Ответ 2
Я использую этот метод:)
Image bgImage = Image.FromFile(workingDir + "\\" + button.BackgroundImage);
currentButton.Image = bgImage;
currentButton.Disposed += (Object sndr, EventArgs evnt) => bgImage.Dispose();
Ответ 3
Если RestartForm расширяет System.Windows.Forms.Form, вы должны иметь возможность переопределить Dispose (bool disposing). Вы должны правильно реализовать это для своего класса "RestartForm", чтобы избавиться от своих IDisposables.
Он должен выглядеть так:
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);
}
Ответ 4
Вам нужно переопределить метод Dispose, этот метод поступает из базового класса Control
protected override void Dispose(bool disposing)
{
if (disposing)
{
event.Dispose();
}
base.Dispose(disposing);
}