2011-10-10 2 views
0

ToolStrip이있는 다른 폼 (SubForm)을 여는 간단한 폼 (MainForm)이 있습니다.ToolStrip에 메모리 누수가 발생하지 않도록하는 방법이 있습니까?

호출 된 양식에는 아무 것도 없습니다. 호출하는 폼에는 버튼 만 있습니다.

SystemEvents.UserPreferenceChanged에 대한 이벤트 처리기가 있기 때문에 호출 된 양식의 메모리는 회수되지 않습니다. 이 문제는 .NET 3.5.1에서 수정 된 문제입니다.

GC가 하위 폼의 메모리를 회수 할 수 있도록

내가 뭔가를 할 수 [편집 응용 프로그램 중 하나가 정말 고정되지 않았거나 내가 뭔가 다른 일을 너무 3.5.1에서 실행]?

ToolStrip을 제거하면 양식 하위 양식을 다시 가비지 수집 할 수 있습니다.

MainForm

public partial class MainForm : Form 
    { 
     public MainForm() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      SubForm subForm = new SubForm(); 
      subForm.ShowDialog(); 
     } 
    } 

하위 폼

public partial class SubForm : Form 
    { 
     public SubForm() 
     { 
      InitializeComponent(); 
     } 
    } 

인스턴스 유지 그래프로 ToolStrip

enter image description here

와,321 0 Large Version
+0

무엇이 문제입니까? .NET이 업데이트되어 버그가 수정 될 수 있어야합니다. Windows Update를 사용하십시오. –

+0

버전 3.5.1에서 앱이 실행되는 것은 확실하지 않습니다. 따라서 업그레이드해도 문제가 해결되지 않습니다. –

+0

그게 진짜로 고쳐졌습니다. ToolStrip을 사용할 때 .NET 2.0에서는 아무 것도 변경하지 않았기 때문에 처분을 사용하지 않았지만 이제는 실제로 처리되었습니다. 답변으로 의견을 게시 할 수 있습니까? –

답변

1

당신은 대화 상자를 보여주고 있지만 결코 그것을 버리지 않으므로, 최소한 using() 절에 넣거나 그렇지 않으면 적절하게 처리하십시오. ShowDialog에 대한 추가 정보보기 here

1

SubForm의 최종자를 입력하고 콘솔에 무언가를 작성하여 양식이 파괴되는지 확인하십시오. 뭔가 같은 ...

~SubForm() 
{ 
    Console.WriteLine("Destroyed!"); 
} 

그런 다음 양식을 작성하는 코드에서 ShowDialog 돌아 오면, 가비지 컬렉션을 수행 할 GC.Collect()을 포함한다. 프로그램을 실행할 때 콘솔 메시지가 표시되면 모두 양호합니다. 그렇지 않으면 ToolStrip 메모리 누수로 인해 메모리 누수가 발생할 수 있습니다.

이 경우 SubForm의 FormClosed 이벤트의 ToolStrip에서 Dispose()으로 전화를 걸어 다시 시도하십시오. 이 문제는 .Net 2를 사용하여 나를 위해 작동합니다. 다시 실행하면 콘솔 메시지가 나타납니다. 그렇지 않은 경우 다른 메모리 누출이있을 수 있습니다 (예 : DateTimePicker)

관련 문제