2014-11-20 2 views
1

나는 flowLayoutPanel을 가진 C# win forms 애플리케이션을 가지고 있습니다.계속해서 플로우 레이아웃 패널 윈폼에 추가 및 제거

매초마다이 패널의 모든 하위 항목을 업데이트해야합니다. 나는 이유 따라서 error creating window handle을 받기 시작 후

public void RefreshReceiversPage() 
    { 
     if (checkBox_enableReceivers.Checked) 
     { 
      var receivers = OutgoingReceiverManager.GetCopyOfActiveRecieverHolders(); 

      for (int i = 0; i < flowLayoutPanel_receivers.Controls.Count; i++) 
      { 
       var tmp = flowLayoutPanel_receivers.Controls[i]; 
       flowLayoutPanel_receivers.Controls[i].Dispose(); 
       tmp.Dispose(); 
      } 
      flowLayoutPanel_receivers.Controls.Clear(); 

      foreach (var item in receivers.ToList()) 
      { 
       var tmpUc = new ucReceiverItem(item); 
       if (flowLayoutPanel_receivers != null) 
       { 
        try 
        { 
         flowLayoutPanel_receivers.Controls.Add(tmpUc); 
        } 
        catch 
        { 
        } 
       } 
      } 
      receivers = null; 
     }    
    } 

지금이 코드는 약 2 분 동안 완벽하게 작동하고 갑자기 여기

내 현재 매 1 초 시스템 타이머에서 호출되는 코드 위의 코드를 시도해보십시오.

그러나이 후 창보기가 재미 있고 프로그램을 다시 시작하지 않고 복구 할 수 없습니다.

나는 높고 낮은 것을 찾았으며 예외가 발생했을 때 아무것도 찾을 수없는 것 같습니다.

내가 생각할 수있는 모든 것은 메신저 개체를 적절히 처분하지 못하고 메모리가 부족한 부분이 어디 있는지 생각할 수 있습니다.

아무도 제안이나 해결책이 있습니까?

편집 :

여기

입니다 UCRecieverItem :

for (int i = 0; i < flowLayoutPanel_receivers.Controls.Count; i++) 
{ 
    var tmp = flowLayoutPanel_receivers.Controls[i]; 
    flowLayoutPanel_receivers.Controls[i].Dispose(); 
    tmp.Dispose(); 
} 
flowLayoutPanel_receivers.Controls.Clear(); 

그것은 단지 컨테이너에있는 컨트롤의 절반을 배치한다 :이 코드는 문제가

public partial class ucReceiverItem : UserControl 
{ 
    public ucReceiverItem(ReceiverHolder item) 
    { 
     InitializeComponent(); 
     ConstructItem(item); 
     item = null; 
    } 

    private void ConstructItem(ReceiverHolder item) 
    { 
     label_name.Text = item.ReceiverDb.Name; 
     label_numberOfConnections.Text = item.ReceiverOutgoingConnectionManager.GetNumberOfConnections().ToString(); 
     label_mrFilters.Text = item.ReceiverDb.MrFilters; 
     label_multipleConnections.Text = item.ReceiverDb.MultipleConnections.ToString(); 
     // 
     int count = item.GetActiveBufferCount(); 
     int size = item.GetActiveBufferSize(); 
     // 
     label_bufferCount.Text = count + @"/" + size; 
     progressBar_buffer.Maximum = size; 
     progressBar_buffer.Minimum = 0; 
     progressBar_buffer.Value = count; 
    } 
} 
+1

'ucReceiverItem'의 생성자와 Dispose 메서드에서 어떤 일이 발생하는지 조사하는 것은 흥미로운 일이라고 생각합니다. – Fratyx

+0

ucReceiverItem 클래스를 게시합니다. – Zapnologica

+1

그 tmp 변수의 포인트가 무엇인지 모르지만 목록 전체가 줄어들면서 목록에서 항목을 삭제하기 때문에 for 루프 전체가 문제가됩니다. 아마도 'while flp.Controls.Count> 0' 루프가 있고 항상 첫 번째 컨트롤을 처리해야합니다 :'flp.Controls [0] .Dispose();'. – LarsTech

답변

3

. 나머지 절반은 Controls.Clear(); 호출에 의해 제거되지만 해당 컨트롤은 삭제되지 않으므로 메모리가 여전히 사용되고 있습니다.

매초마다이 작업을 수행하면 문제가 될 수 있습니다. 잠재적으로 많은 제어가 가능합니다.

즉각적인 작품은 주위에 제대로 컨트롤을 처분하는 것입니다 :

while (flowLayoutPanel_receivers.Controls.Count > 0) { 
    flowLayoutPanel_receivers.Controls[0].Dispose(); 
} 

그 후, 내가 할 필요성에 의문을 제기 것이 매 초마다 - 사용자가에서 작동 할 수있는 가혹한 환경처럼 보인다 .

+0

고마워,이 시도하고 피드백을 줄 것이다. – Zapnologica

+0

지금까지 잘 작동하는 것 같습니다. – Zapnologica