2014-11-08 61 views
1

我有一個C#用戶控件創建使用許多其他Microsoft標準控件和其內存泄漏。我有定時器功能和拖放功能。需要關於C#.Net用戶控制內存泄漏的幫助。它似乎system.Timer函數導致泄漏

爲了模擬這個問題,我創建了一個簡單的C#用戶控件。其他Microsoft控件(如面板,樹視圖控件,ListControl,上下文菜單,工具提示,DateTimePicker)都放在它上面。我訂閱了這些控件事件,並且在事件處理程序中使用Debug.Writeline()寫了一些文本。 我已經設置了AllowDrop這些控件的屬性爲true。我的計時器功能以1500毫秒間隔運行,切換樹視圖節點並顯示/隱藏上下文菜單。

我的定時器功能

void timer_Tick(object sender, EventArgs e) 
     { 
      this.treeView1.Nodes[0].Toggle(); 
      this.treeView1.Nodes[0].Nodes[0].Toggle(); 
      string test1 = "this 123"; 
      if (toggleSwitch) 
      { 
       this.contextMenuStrip1.Show(this, 200, 10); 
      } 
      else 
      { 
       this.contextMenuStrip1.Hide(); 
      } 
      toggleSwitch = !toggleSwitch; 
      Debug.WriteLine(test1); 

      //GC.Collect(); 
      //GC.WaitForPendingFinalizers(); 
      //GC.Collect(); 
     } 

當我運行的ActiveX容器或微軟的用戶控件容器該用戶的控制,我看到該內存一直上升。它在一段時間內停止增長,但在一段時間後又增加,它不會減少。它在一天內增加了9 MB。

使用.net分析器我發現對象被DropTarget,Timer,EventHandler阻止,它們再次被GCHandle實例阻止。還創建了Native.TrackMouseEvent對象的新實例,這些對象也被DropTarget實例阻止。

請幫我解決這個問題。我試着在定時器函數中調用GC.Collect,但沒有奏效。如果我停止計時器功能。沒有內存泄漏。

.NET探查圖像顯示對象通過的DropTarget和定時器阻礙樣品 .net profiler image showing object held back by droptarget and timer

源代碼可在dropbox它需要我還沒有共享.snk文件。當你運行這個應用程序時,它將啓動用戶容器。

+0

恕我直言,一天增加9MB,不可能成爲內存泄露的良好指標。圖像太小,看不清。而且,你的代碼片段也看起來相當簡單,我懷疑它有什麼可以直接與泄漏,如果有的話。是否有可能添加更多的代碼的問題..可能是如何使用事件和計時器控制? (我已經看到事件處理程序和計時器的使用方式會導致泄漏速度緩慢)。 – 2014-11-09 00:31:39

+0

您肯定會忘記調用計時器的Dispose()方法。它會繼續滴答作響。並保留一切形式的參考。鍋板固定是從工具箱中放下定時器,一個自動處理。 – 2014-11-09 00:37:30

+0

嗨visak,我已經更新了源代碼的帖子。這只是一個示例應用程序。在我的實際代碼中,我看到其他類實例也沒有被釋放,因爲它由timer和droptarget對象持有。由於我不關閉這個控件,我沒有調用定時器處理函數。我處理用戶控件,我將調用timer.dispose函數。您可以通過複製圖像鏈接並將其粘貼到瀏覽器上來查看圖像。 – 2014-11-09 00:57:42

回答

0

它不會泄漏內存。我發現儘管記憶在每次滴答後都會增加,但經過一段時間後會停止增加並停留在那裏。