NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# C# UserControl에서 메모리 릭(Memory Leak)이 발생하는 경우 Dispose 인터페이스 재정의 하기.

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 엔지엠 매크로의 뷰(Page, Dock을 통칭해서 일컷는 표현)는 UserControl로 되어 있습니다. UserControl은 Dock Container에 자동으로 추가되고, Dock Manager와 Workspace가 관리하는 구조로 되어 있습니다. 아무튼, 복잡한 내용은 일단 뒤로하고, UserControl에서 메모리 릭이 발생할 때 해결하는 방법에 대해 알아보겠습니다.

     

    UserControl은 기본적으로 IDisposable을 상속받아서 구현하고 있습니다. 그렇기 때문에 추가적인 작업이 불가능합니다. 뷰에 추가된 컨트롤중에서 메모리 문제가 있는 컨트롤들은 명시적으로 Disposing 시켜줘야 합니다. 아래와 같이 UserControl이 메모리에서 해제될 때 자동으로 호출되는 OnHandleDestroyed 이벤트를 재정의해야 합니다.

            protected override void OnHandleDestroyed(EventArgs e)
            {
                this.treeView.Nodes.Clear();
                this.treeView.Dispose();
                base.OnHandleDestroyed(e);
            }

     

    이 UserControl에는 TreeView가 추가되어 있습니다. TreeView 콘트롤에 추가된 모든 TreeNode를 삭제하고, TreeView도 Dispose해줍니다. 일반적으로 IDisposable를 상속 받아서 리소스를 명시적으로 제거하지만, Close 메소드를 추가적으로 제공하는 경우들도 있습니다. 엔지엠 매크로도 편집기 인터페이스들은 Close 메소드를 일부 구현해야 합니다.

            public void Close()
            {
                this.Dispose();
            }

     

    C# 프로그래밍에서 Close 메소드를 호출하고, Dispose 메소드까지 호출하는 경우가 많습니다. 하지만, 로직상 Close 메소드를 한번만 호출해도 자동으로 Dispose까지 호출하기 때문에 중복해서 메소드를 불러올 필요는 없습니다. 아마도 예외없이 Close 메소드에서 Dispose를 호출할테니까요. 

     

    그래서, Close 메소드를 강제해야 하는 인터페이스의 경우에 Dispose가 있으면 호출하고, 없으면 Close에서 리소스를 모두 해제해야 합니다. UserControl은 Dispose가 호출되면 자동으로 OnHandleDestroyed 이벤트가 호출됩니다.

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.