2012-09-02 147 views
1

我有一個程序使用ListView向用戶界面輸出大量數據。有時可能會填滿超過500MB的數據,但這不是我的問題。我的問題是,如果我嘗試通過listview.Items.Clear();清除列表視圖中的項目,我的應用程序的內存消耗只會下降一小部分,然後坐在那裏。從一個全新的Windows窗體應用程序,只有一個列表視圖的內存示例:Listview清除內存並釋放內存

  • 7,812K - 程序運行時未添加任何列表視圖項目。
  • 26,816K - 分配給值「test」的50000個ListView項目填充
  • 22,860K - 清除先前的50000個ListView項目後的內存。

內存值來自任務管理器。

我的問題是,listview.Items.Clear()並沒有釋放列表視圖項所佔用的所有內存,據我所知。

相關信息:在我的測試程序中,它包含的是帶有'details'視圖屬性和一列的ListView。

相關代碼:

public void Test() 
{ 
    for (int i = 0; i < 50000; i++) 
    { 
     listView1.Items.Add(new ListViewItem("test")); 
    } 
} 
private void listView1_Click(object sender, EventArgs e) 
{ 
    listView1.Items.Clear(); 
} 

回答

0

清除列表視圖不處置的物品,這就是爲什麼內存保持不變的原因。

但是,如果項目中沒有引用任何項目,那麼當垃圾收集器啓動時,它們將被正確處理,內存將再次下降。

+0

您是否在清除列表後提示GC.Collect()? – BlackBear

+0

通常不建議調用GC.Collect(),因爲在某些情況下可能會導致性能問題。但是,如果您真的關心內存使用情況,並且沒有等待GC完成它的工作,請嘗試一下,看看它是否會影響您的應用程序。來源:http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx(在筆記下) – coolmine

+0

GC.Collect()似乎解決了我的問題,但我一直聽到它有多糟糕,而且我不知道我不希望對我的計劃產生負面影響。有沒有其他方法可以銷燬/處理對象而不調用GC.Collect? – cloud