관리 메뉴

KorSA

C#, WPF 창이 중복으로 뜬다면.. EventHandler를 의심하라 본문

Development Experience/C#

C#, WPF 창이 중복으로 뜬다면.. EventHandler를 의심하라

Praiv. 2020. 3. 27. 00:02
320x100

C#, WPF 개발 도중 팝업을 띄우는 기능을 쓸 일이 있었다.

 

어떤 설정을 하는 SettingWindow를 띄우고,

세팅 도중 올바른 설정이 아니면 Popup 창을 띄워서 오류를 지적해주는 기능이었다.

 

그런데 어느 순간부터

올바른 설정이 아닐 때 Popup 창이 중복으로 여러번 띄워지는 에러가 나고 있음을 발견하였다.

난 분명 한번만 Popup 창을 띄워서 사용자에게 잘못된 설정을 인지시키고 리턴하도록 코드를 짰는데...

30분정도 헤메다 원인을 찾았다.

 

실마리는, Popup 창이 중복으로 띄워지는 횟수가 SettingWindow를 몇 번 띄웠는지와 정비례하게 증가한다는 사실이었다.

 

즉 사용자가 무언가 설정할 필요가 있어서 SettingWindow를 띄우고 이것저것 설정하는 시나리오를 생각해보자.

사용자가 잘못된 설정을 시도할 경우 프로그램은 Popup 창을 띄워 경고해준다. 이 땐 Popup 창이 정상적으로 딱 한 번만 뜬다.

사용자가 잘 세팅하고 SettingWindow를 Close했다.

좀 더 프로그램을 쓰다보니 다른 설정을 추가로 해야할 경우가 생겼고 사용자는 다시 SettingWindow를 열었다.

사용자는 프로그램 사용에 미숙하여 또 잘못된 설정을 시도하였고, 프로그램은 Popup 창을 띄워 경고해주었다. 그런데 이번엔 Popup창이 두번 뜨는 것이었다.

 

이렇게 SettingWindow를 세번 띄웠을 땐 Popup창도 세번 뜨는 증상이었다.

 

디버깅해보니, SettingWindow를 닫을 때 EventHandler를 제거해주지 않았기 때문에 발생하는 오류였다.

나는 Popup창을 띄우기 위해 EventHandler를 사용하는데,

이 EventHandler가 SettingWindow 창이 닫힌 후에도 메모리에 계속 남아있다가

다음 번 SettingWindow가 띄워지면 새로 생성된 EventHandler와 

아까부터 메모리에 남아있던 EventHandler가 함께 공존하는 것이었다.

 

그래서 어떤 Event가 발생하였을 때,

그 때 메모리 상에 존재하는 모든 EventHandler들이 한꺼번에 반응하면서 Popup창을 여러 번 띄운 것이었다.

 

아직 C#의 EventHandler에 대해 깊이 알지는 못하지만,

이 기회에 EventHandler를 잘못 사용한 결과를 알게 된 좋은 시간이었다.

 

아.. 조만간 C#의 EventHandler에 대해 Deep한 포스팅을 하나 해야겠다.

728x90
728x90
Comments