그리기 및 응용 프로그램 종료 시 C#에서 ObjectDisposedException을 방지하는 방법

StackOverflow https://stackoverflow.com/questions/90662

  •  01-07-2019
  •  | 
  •  

문제

저는 CompSci 학생이고 C#을 처음 접했고 수업에 대한 "Josephus Problem" 프로그램을 수행하고 있었고 언제든지 종료하기 위해 Application.Exit()를 호출하는 종료 버튼을 만들었습니다. 하지만 C#이 여전히 페인팅 작업 중 버튼을 누르면 그래픽 개체에 대한 ObjectDisposedExeception이 발생합니다.이를 방지할 수 있는 방법이 있나요?.종료하기 전에 페인팅 프로세스를 중지하도록 알리기 위해 부울을 잡아내거나 변경하려고{}생각하고 있었지만 다른 해결 방법이 있는지 알고 싶습니다.

도움이 되었습니까?

해결책

이런 일이 일어나서는 안 됩니다.버튼이 창과 동일한 스레드에 생성된 경우 메시지 펌프를 공유하며 종료 버튼을 처리하기 위해 페인트 핸들러를 중단할 수 없습니다.버튼을 클릭했다는 메시지는 Paint 핸들러가 반환될 때까지 스레드의 메시지 대기열에 보관됩니다.

일반적으로 그리기를 Paint 처리기로 연기하거나 OnPaint를 재정의해야 하며 화면을 업데이트해야 하는 다른 모든 곳에서는 컨트롤의 Invalidate 메서드를 호출해야 합니다.이는 해당 영역을 다시 칠해야 함을 Windows에 알리고, 다른 모든 메시지가 처리되면 WM_PAINT 궁극적으로 OnPaint를 호출하고 Paint 이벤트를 발생시키는 메시지입니다.

애니메이션을 적용하는 경우 System.Windows.Forms.Timer 스레드를 사용하는 대신 각 프레임을 트리거합니다. System.Threading.Timer 콜백은 스레드 풀에서 실행되므로 항상 UI를 조작하기 위한 잘못된 스레드에 있습니다.

다른 팁

양식을 순서대로 닫으려면 단추가 포함된 양식의 Close() 메서드를 호출해야 합니다.기본 양식을 닫으면 애플리케이션이 종료됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top