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 해줬더니 메모리 릭을 해결 할 수 있었다.

 

참고:

https://stackoverflow.com/questions/12610535/properly-disposing-of-and-removing-references-to-usercontrols-to-avoid-memory

 

Properly disposing of, and removing references to UserControls, to avoid memory leak

I'm developing a Windows Forms application (.NET 4.0) in c# using Visual c# express 2010. I'm having trouble freeing up memory allocated to UserControls I'm no-longer using. The problem: I have a

stackoverflow.com

 

728x90

+ Recent posts