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한 포스팅을 하나 해야겠다.
'Development Experience > C#' 카테고리의 다른 글
C# Winform DropDownList의 SelectedIndex 이벤트 관리 (Telerik 사용) (2) | 2020.11.30 |
---|---|
WPF Window 창이 작업 표시줄 (Task bar) 을 덮는다면.. (0) | 2020.03.30 |
WPF TreeView Header 클릭 안될 때 (0) | 2020.03.26 |
WPF C# Button Command in DataTemplate (바인딩이 안될때..) (0) | 2020.03.19 |
C# SynchronizationContext 와 await (0) | 2020.03.19 |