programing tip

WinForm의 Dispose 메서드를 어떻게 확장합니까?

itbloger 2020. 12. 1. 07:44
반응형

WinForm의 Dispose 메서드를 어떻게 확장합니까?


FxCop에서이 경고를 받고 있습니다.

" 'RestartForm'에는 IDisposable 유형 'ManualResetEvent'인 'RestartForm.done'필드가 있습니다. 'RestartForm'의 Dispose 메서드를 변경하여이 필드에서 Dispose 또는 Close를 호출합니다."

좋아, 내가 무엇을이 방법을 이해하고, 제외 이유는 ... 수행해야 할 것입니다 System.Windows.Forms.Form당신도 무시할 수 없습니다 .Close()또는 .Dispose()이렇게 무엇을? 현재이 솔루션으로 실행 중입니다.

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

내 응용 프로그램에 맞게 작동하지만 FxCop은 여전히이 메시지를 표시합니다. 내가 보장되고 안전하게 무시할 수 있습니까? 아니면이 작업을 수행해야하는 다른 방법이 있습니까?


다음에서 Dispose메서드 를 재정의해야합니다.Form

일반적으로 이는 RestartForm.Designer.cs 파일에서 자동으로 재정의되므로 디자이너가 다시 작성하지 않고도 추가해야하는 코드를 추가 할 수 있도록 dispose를 코드 파일로 이동해야합니다.

RestartForm.cs에서

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

    // Dispose stuff here
  }

  base.Dispose(disposing);
}

이 방법을 사용합니다 :)

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

RestartForm이 System.Windows.Forms.Form을 확장하는 경우 Dispose (bool disposing)를 재정의 할 수 있어야합니다. IDisposables를 처리하려면 "RestartForm"클래스에 대해이를 올바르게 구현해야합니다.

다음과 같아야합니다.

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);
}

Dispose 메서드를 재정의해야합니다.이 메서드 는 Control 기본 클래스 에서 가져옵니다.

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

참고 URL : https://stackoverflow.com/questions/1052147/how-do-i-extend-a-winforms-dispose-method

반응형