0

我有一个winform应用程序。主要形式是单例,它加载了很多图像。图片代表产品,每次点击图片,我都会修改产品的库存并重新加载产品和图片的哈希表。

问题在于每次我从 BBDD 重新加载产品的哈希表并重新加载图像时。在一天结束时,应用程序消耗了大量内存,我不知道何时以及如何卸载图像以便重新加载(因为有时我可以修改图像并且我也必须重新加载)

重新加载哈希表和按钮的代码是:

Family fam = new Family();

List<Family> listFamilies = fam.loadFamilies();
htProducts.Clear();

foreach(Family family in listFamilies)
{
   //reload all the products of each family
   if(htProducts[family.idFamily]==null)
   {
     List<Product> listProducts= fam.loadProductsFamily(family.idFamily);
     htProducts[family.idFamily] = listProducts;
   }
   Button bt = new Button();
   bt.location = new Point(x,y); //The buttons are created dinamically
   bt.Parent = panelFamilies;//I have all the buttons inside a panel.
   try
   {
      if(family.urlImage !="")
      {
         bt.Text=family.Name;
         bt.Image = new Bitmap(family.urlImage);
      }
   }
   catch(Exception ex)
   {
     ....
    }

}

当我点击一个系列按钮时,它会加载该系列的产品,但代码或多或少是相同的。它也加载图像。

或多或少这是代码。问题是每次单击按钮时,我都会在产品中加载更多按钮并加载图像。

很多时候,我重新加载单例表单并执行之前的代码,然后再次加载图像并耗尽内存。

¿ 何时以及如何卸载图像?

编辑:

在再次加载带有图像的按钮之前,我添加了以下代码:

foreach (Control c in panel8.Controls)
{
    if (c is Button)
        c.Dispose();
}
GC.Collect(GC.MaxGeneration);// I think that isn't correct to use because I've read,  but reduces the memory.

它会在再次加载图像之前处理面板的所有按钮和图像并减少内存吗?

顺便说一句对不起我的英语:(

非常感谢。

4

3 回答 3

2
foreach (Control c in panel8.Controls)
{
    if (c is Button)
        c.Dispose();
}

那是行不通的。通常,当您在迭代集合的 foreach 语句中更改集合时,.NET 集合类会引发 InvalidOperationException。不幸的是,这并没有为 Controls 集合实现。所以这段代码所做的只是处理所有其他控件。这足以导致不受控制的资源泄漏,不仅是 Button 控件,还有它们的图像。

解决方法是向后迭代 Controls 集合,如下所示:

for (int ix = panel8.Controls.Count - 1; ix >= 0; --ix) {
    Control c = panel8.Controls[ix];
    // etc...
}
于 2012-08-27T23:21:13.113 回答
1

听起来您在表格中保留了一个或两个参考。

您应该使用诸如 CLRProfiler 或 ANTs 之类的调试器来查看您的进程,以了解在您的进程中占用如此多内存的原因。获得此信息后,您可以采取下一步措施,确保释放对它的所有引用,以便收集它。

于 2012-08-27T21:41:27.990 回答
1

要排除故障,请致电

GC.Collect(GC.MaxGeneration);

这将强制进行垃圾收集。然后在进程资源管理器或任务管理器中检查内存使用情况。如果它更小,则仅意味着运行时决定不收集内存。

如果它不起作用,则需要查找内存泄漏。

于 2012-08-27T21:49:40.853 回答