Как расширить метод WinForm Dispose? - программирование
Подтвердить что ты не робот

Как расширить метод 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 все еще показывает это сообщение. Я покрыл и могу ли я смело игнорировать его, или есть ли другой способ, которым я должен это делать?

4b9b3361

Ответ 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);
}