重复实例化,导致内存不足问题

nesto 2011-08-15 02:08:31
我用winform做了一个显示图片的东西,然后显示图片的是一个自定义控件,我再循环加载图片的时候,每加载一张图片就会实例化一次这个控件,结果导致内存不足,请问有什么方法可以解决,或者其他加载图片的方法。
...全文
220 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
bugers 2011-08-15
  • 打赏
  • 举报
回复
自定义控件.图片=new 图片;
不要每次实例化一个新的 自定义控件,这样之前看过的图片 由于没有引用 会被垃圾回收的。

内存不足是因为你之前引用的图片 都还在引用,不会被回收内存空间。多了 自然内存不够了
nesto 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yysyangyangyangshan 的回复:]
界限是 字节
[/Quote]

我试过了,这样并不能满足我的要求,过程是这样的,我有一个自定义控件,上边包含一个picturebox,两个label 还有一个button ,然后两一个界面上边是一个panel,然后我再这个panel中加载这个自定义控件,每显示一张图片就要家在一次,在操作的时候还要重新记载,也就需要重新实例化,这样就导致了最终内存不足的情况。
每次实例化都会分配一个内存,但是在这个有panel的界面没有关闭的时候,是无法释放内存的,多以内存占用就会越来越大。
我现在想如何在不重复实例化的情况下显示多张图片,并且具有自定义控件中的那些操作功能。
nesto 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 liuhongzhe 的回复:]
你是不是要做一个图片浏览的工具?
[/Quote]

差不多吧,不过,在显示出来之后我还要对这些图片进行一些操作。
劉宏哲 2011-08-15
  • 打赏
  • 举报
回复
你是不是要做一个图片浏览的工具?
杨友山 2011-08-15
  • 打赏
  • 举报
回复
界限是 字节
jrl951 2011-08-15
  • 打赏
  • 举报
回复
我的做法是这样的
if (backimage != null)
{
backimage.Dispose();

}
backimage = new Bitmap(Assembly.GetExecutingAssembly().GetManifestResourceStream(backimagepath));
nesto 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 liuhongzhe 的回复:]
这种情况,一般都是你的设计不太合理。具体你的业务我不清楚,只能说你再想想你的业务,是不是一定要这么设计。不要在这个问题上花太多时间,好好想想设计是否合理。
[/Quote]

我试过使用dispose释放资源,但是在释放了资源之后,图片就显示不出来了!
nesto 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yysyangyangyangshan 的回复:]
try
{
System.Diagnostics.Process p = System.Diagnostics.Process.GetCurrentProcess();
if (p.WorkingSet > 10240000)//填个界限
{
……
[/Quote]

你好,业务确实是需要这样的,需要显示很多图片,并且是实时刷新,但是目前我没想到其他的更好的方法。
nesto 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 nesto 的回复:]
我用winform做了一个显示图片的东西,然后显示图片的是一个自定义控件,我再循环加载图片的时候,每加载一张图片就会实例化一次这个控件,结果导致内存不足,请问有什么方法可以解决,或者其他加载图片的方法。
[/Quote]
你好,请问这个界限的单位是什么呢?
白鸽 2011-08-15
  • 打赏
  • 举报
回复
动态的更换图片空间的路径不是更好吗!为什么每次要去实例化那个控件,这样的实现系统的负担会很大!

isjoe 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 nesto 的回复:]
我用winform做了一个显示图片的东西,然后显示图片的是一个自定义控件,我再循环加载图片的时候,每加载一张图片就会实例化一次这个控件,结果导致内存不足,请问有什么方法可以解决,或者其他加载图片的方法。
[/Quote]

不在显示使用的图像,立即释放就可以了 Image.Dispose ()
劉宏哲 2011-08-15
  • 打赏
  • 举报
回复
这种情况,一般都是你的设计不太合理。具体你的业务我不清楚,只能说你再想想你的业务,是不是一定要这么设计。不要在这个问题上花太多时间,好好想想设计是否合理。
杨友山 2011-08-15
  • 打赏
  • 举报
回复
try
{
System.Diagnostics.Process p = System.Diagnostics.Process.GetCurrentProcess();
if (p.WorkingSet > 10240000)//填个界限
{
p.MaxWorkingSet = p.MaxWorkingSet;
}
}
catch (System.Exception ex)
{
}
试试能行不

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧