728x90
대략의 동작은 Panel 에 UserControl 을 Add 하고 화면정리를 할때 UserControl 을 Remuve 하고 Dispose 를 해준다.
여기서 문제가 발생한다.
foreach (Control control in flowPanel.Controls) {
flowPanel.Controls.Remove(control);
control.Dispose();
}
이런식으로 단순하게 루프 돌려서 삭제를 하면 이상하게 짝수번째만 동작 한다?!
이유는 잘 모르겠지만 오래된 버그라고 한다?!
for (int ix = flowPanel.Controls.Count-1; ix >= 0; --ix) {
var ctl = flowPanel.Controls[ix];
flowPanel.Controls.Remove(ctl);
ctl.Dispose();
}
거꾸로 루프를 삭제를 하면 문제없이 전부 동작을 한다고 한다.
그런데 이렇게 Panel에서 컨트롤 삭제하고 Dispose 를 해줬는데도 메모리 릭이 발생했다.
이걸로 몇일 삽질 한거 같은데.
메모리 스넵샷을 찍어서 분석 했더니 Timer Event 가 점점 증가 되고 있었다.
UserControl Dispose를 했는데도 Timer Event 는 남아 있는걸로 보였다.
UserControl 에 있던 Timer Event 해제를 안해줘서 아마도 GC 에서 메모리 해제를 못한걸까?!
으흠 일단은 아래처럼
//컨트롤 지워질때 동작
protected override void OnHandleDestroyed(EventArgs e)
{
Timer1.Dispose();
Timer2.Dispose();
}
유저컨트롤이 삭제될때 타이머 이벤트를 Disposer 해줬더니 메모리 릭을 해결 할 수 있었다.
참고:
728x90
'C#' 카테고리의 다른 글
C# / 프로그램 재시작 하기 / 메모리릭 없이...ㅂㄷㅂㄷ... (0) | 2021.10.21 |
---|---|
C# / ScreenRecorderLib.dll Fody 사용시 에러 해결 하기 (0) | 2021.10.21 |
C# / UserControl Close Event / 유저컨트롤 닫힘 이벤트 (0) | 2021.10.05 |
C# / 절전 모드 방지 하기 / setthreadexecutionstate (0) | 2021.09.03 |
C# / 도구 상자 항목 ' ' 을(를) 로드하지 못했습니다. 해당 항목은 도구 상자에서 제거됩니다. / 유저 컨트롤 (1) | 2021.08.10 |