Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#单例winform加载/卸载映像_C#_Image_Singleton_Dispose_Idisposable - Fatal编程技术网

c#单例winform加载/卸载映像

c#单例winform加载/卸载映像,c#,image,singleton,dispose,idisposable,C#,Image,Singleton,Dispose,Idisposable,我有一个winform应用程序。主要形式是singleton,它加载了很多图像。图像代表产品,每次单击图像时,我都会修改产品的库存并重新加载产品和图像的哈希表 问题在于每次我从BBDD重新加载产品哈希表并重新加载图像时。在一天结束时,应用程序消耗了大量内存,我不知道何时以及如何卸载图像以便重新加载(因为有时我可以修改图像,我也必须重新加载) 重新加载哈希表和按钮的代码是: Family fam = new Family(); List<Family> listFamilies =

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

问题在于每次我从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)
   {
     ....
    }

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

顺便说一句,我的英语很抱歉:(


非常感谢。

听起来你在表格中保留了一两个参考资料


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

听起来您在f中保留了一两个引用奥姆

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

要进行故障排除,请致电

GC.Collect(GC.MaxGeneration);
这将强制垃圾收集。然后在process explorer或任务管理器中检查内存使用情况。如果其较小,则仅表示运行时决定不收集内存

如果无法正常工作,则需要查找内存泄漏。

要进行故障排除,请致电

GC.Collect(GC.MaxGeneration);
foreach (Control c in panel8.Controls)
{
    if (c is Button)
        c.Dispose();
}
这将强制垃圾收集。然后在process explorer或任务管理器中检查内存使用情况。如果其较小,则仅表示运行时决定不收集内存

如果它不工作,你需要找到内存泄漏

foreach (Control c in panel8.Controls)
{
    if (c is Button)
        c.Dispose();
}
这是行不通的。通常,.NET集合类在您在迭代集合的foreach语句中更改集合时会引发InvalidOperationException。不幸的是,这不是为控件集合实现的。因此,此代码所做的只是每隔一个控件处理一次。这足以导致不受控制的重新运行源泄漏,不仅仅是按钮控件,还有它们的图像

修复方法是向后迭代控件集合,如下所示:

for (int ix = panel8.Controls.Count - 1; ix >= 0; --ix) {
    Control c = panel8.Controls[ix];
    // etc...
}
这是行不通的。通常,.NET集合类在您在迭代集合的foreach语句中更改集合时会引发InvalidOperationException。不幸的是,这不是为控件集合实现的。因此,此代码所做的只是每隔一个控件处理一次。这足以导致不受控制的重新运行源泄漏,不仅仅是按钮控件,还有它们的图像

修复方法是向后迭代控件集合,如下所示:

for (int ix = panel8.Controls.Count - 1; ix >= 0; --ix) {
    Control c = panel8.Controls[ix];
    // etc...
}

那么,展示一些代码怎么样?我们不是读心术的人,她。你真的需要更深入地了解你正在做的事情。解释你到目前为止所研究的内容并提供一些代码会有很大帮助。是的,对不起,我用一些代码更新了解释。那么展示一些代码怎么样?我们不是读心术的人,她。你真的不知道吗需要更深入地了解您正在尝试执行的操作。解释您迄今为止所了解的内容并提供一些代码将大有帮助。是的,抱歉,我已使用一些代码更新了解释。我了解到调用GC是不好的。无论如何,我的winform是单例的,因为我需要它,但我需要重新加载图像,因为有时图像会丢失某些按钮的url可能会更改。但是每次我重新加载所有带有图像的按钮时,内存都会增长…是的,不应该使用GC,但我写道,在进行故障排除时可以使用GC。然后删除GC调用。我读到调用GC不好。无论如何,我的winform是单例的,因为我需要它,但我需要再次重新加载图像,因为这样有时,某些按钮的图像url可能会更改。但每次我重新加载带有图像的所有按钮时,内存都会增长…是的,不应该使用GC,但我写道,在进行故障排除时可以使用GC。然后删除GC调用。好的,如果要删除字典中的某些值对,大致相同。我将尝试您的选项。无论如何,您的选项对卸载加载的图像有效?我必须调用GC.Collect?因为我读到调用该选项不正确,因为它会自动执行。正确处理按钮现在也会处理其图像属性。不要使用GC.Collect()。好的,谢谢。我使用该选项是因为使用GC.Collect(GC.MaxGeneration)执行应用程序我可以看到内存是如何减少的,不管怎样,我将尝试不使用它。再想想,在您的“for”代码中,我可以在那里写:c.Dispose();当GC.collect()时,它将释放内存自动执行?它将删除内存中的所有图像?谢谢,如果您想删除某个字典的值对,或多或少都是一样的。我将尝试您的选项。无论如何,您的选项对于卸载加载的图像是有效的?我必须调用GC.Collect?因为我读到调用它是不正确的,因为它是自动执行的。Properly处理按钮现在也会处理它们的图像属性。不要使用GC.Collect()。好的,谢谢。我使用它是因为使用GC.Collect(GC.MaxGeneration)执行应用程序时,我可以看到内存是如何减少的,无论如何,我会尝试不使用它。再想想,在你的“for”代码中,我可以在那里写:c.dispose();当GC.Collect()时,它会释放内存自动执行?它将删除内存中的所有图像?谢谢