회사에서 우리팀의 Windows Application 상용 프로그램을 만들어야 하는 이슈가 발생했다.
논의 끝에 VS 기반의 C#으로 기능을 구현하기로 하였고
Windows Application 개발 경험(개인 프로젝트인데.....;;;)이 있는 내가 설계부터 구현, 테스트까지 1인 프로젝트를 맡게 되었다.
나 역시도 C#이 주종목이 아니기에 무한한 지식의 조력자(Google-감사!)와 함께 진행하는 것으로
내 프로그램의 모든 기능들은 C# 프로그래밍의 정석으로 만들어 지는 것이 아니다.
그저 같은 기능을 구현함에 있어 수많은 구현 방식 중에 내 경험 및 지식에 빗대어 가장 유연하게 동작할 수 있는 방법을 채택하여 재조립 할 뿐.
때문에 구현하는 중간중간 다양한 버그 및 오류에 부딪친다.
이번 Exception Case는 기존 개인 프로젝트(L-ATS)를 진행하면서는 발생하지 않았던 문제였었는데 이번에 겪게되어 현재 내가 설계한 프로그램의 성격에 알맞는 방식으로 처리한 내용을 기록해 본다.
C#이나 WFP가 주종목이신 분들은...아주 사소한 문제일거 같다...
Ocurred Exception
System.ObjectDisposedException: '삭제된 개체에 액세스할 수 없습니다.'
Exception 발생 Case
- Parent Form과 Child Form이 존재
- Parent Form에서 Child Form.show()를 호출하여 Form을 띄우고 Child Form에 입력한 Data를 Parent Form에서 받아서 처리 (Delegate Event 사용)
2020.06.20 - [C#] - [C#] delegate, 폼 간의 DATA 공유
- Child Form에서 Data 입력 후 [ 확인 ] 시, Form Close() 후, 해당 Parent Form에서 Child Form을 다시 show() 할 때 발생
Child Form에서의 Close() 함수 호출에 의해 완전 삭제된 Child Form의 객체를 다시 show() 호출로 로딩하려고 하니 이미 삭제된 객체를 불러올 수 없다는 말이다.(인것 같다...)
Child Form 내부에서 self로 Close()를 하게되면 해당 객체를 생성한 Parent Form에서 객체 삭제를 하지 않아도 자동으로 삭제 된다는 것일까...?
사실 이 Disposed Exception은 비단 Form에 한정되어 나타나는 현상은 아니다.
WinForm의 어떠한 객체라도 삭제된 후 접근하려 할 경우 같은 현상이 나타날테니 말이다.
때문에 이 Exception을 해결하는 방법은 아주 다양하고 상황에 따라 합리적인 예시들이 많이 있다.
내가 만들고 있는 프로그램의 Child Form의 역할은
프로그램을 운용하기 위한 기본 설정 값들을 사용자에게 입력 받아 Parent Form으로 전달하는 역할을 한다.
쉽게 프로그램의 설정 POP-UP이라고 생각하면 된다.
나는 Child Form의 [ FormClosing() ] 이벤트에 아래 코드를 추가하는 방식을 택했다.
private void micSetting_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
this.Hide();
}
e.Cancel = true
FormClosing 작업을 취소하겠다는 것
this.Hide()
Form을 숨기겠다는 것
따라서 나는 분명 Child Form을 닫는 this.Close()를 호출하였지만 Form이 닫히는 과정(Form Closing)에서 Form이 닫히는 것을 취소하고 Form을 안보이도록 숨기겠다(Hide)는 뜻이다.
여기서 중요한 점은.
Form을 사용자가 보지 못하게끔 숨기기만 하는 것으로 (사용자 입장에서는 Form이 꺼진것처럼 보이지만...)
이전에 Child Form에 입력한 값이 그대로 보인다는 것이다. Form을 숨기기만 하고 다시 보여주는 것이니 당연한 결과다.
프로그램의 설정값을 입력하는 목적의 Child Form을 만들 경우 사용자 입장에서는 이전에 입력한 값이 그대로 보여지니 이 방법이 내가 설계한 프로그램에는 가장 적합한 해결책인 것이다.
만약 Form을 삭제하고 다시 객체를 생성해서 Child Form을 띄울 경우 기존에 입력했던 값들을 다시 Parent Form에서 받아 오든, 아니면 특정 위치에 저장을 해서 불러오든 해야하기에 구현의 까다로움이 존재하므로 굳이 이 방법을 사용하지 않아도 좋은 프로그램을 만들 수 있다.
'C#' 카테고리의 다른 글
[C#] Class 속성, Property, 프로퍼티 (1) | 2020.08.21 |
---|---|
[C#] Collection, Generic Collection, ArrayList (0) | 2020.08.17 |
[C#] 클래스 배열, 객체 배열, Null Reference Exception (0) | 2020.08.13 |
[C#] 다른 파일, 다른 클래스 값/함수 사용 (1) | 2020.06.28 |
[C#] delegate, 폼 간의 DATA 공유 (2) | 2020.06.20 |