当前位置:  开发笔记 > 小程序 > 正文

winforms ImageList的内存问题

如何解决《winformsImageList的内存问题》经验,为你挑选了1个好方法。

我有一个ImageList填充,你猜对了,图像.这些图像作为数据集加载到数据集的内存中Bitmap.直到我把它们装进ImageList内存的崛起并不担心.但是当它们被添加到ImageList内存使用天空火箭时.但最大的问题是我必须重新加载图像列表.我试图在列表中的每个图像上调用dispose但是内存没有被释放.这是我试图清理内存的代码:

        foreach (Image item in imageList.Images)
        {
            item.Dispose();

        }
        imageList.Images.Clear();

        GC.Collect();

我究竟做错了什么?



1> Hans Passant..:

您的处理代码不合适.迭代Images集合实际上为每个图像创建了一个新的位图.然后你再次立即处置.只需调用Clear()即可.

GC.Collect()也没有任何影响,ImageList类是本机Windows组件的包装器.它将图像存储在本机内存中,而不是垃圾收集内存.

最后但并非最不重要的是你的真正问题:Windows内存管理器并不像你想象的那样工作.它释放内存时不会缩小程序的虚拟内存大小.它只是将内存块标记为未使用,并将其添加到空闲块列表中.准备好以后再使用.只有在极少数情况下,释放的内存恰好跨越整个保留内存页面集,才能缩小虚拟内存大小.这不是一个真正的问题.这是虚拟的.


不,你误解了.在将位图添加到ImageList之后,您必须尽早处置位图.本机控件制作副本.你以后不能处理位图,引用就不见了.如果位图非常大,那么OOM总是有很好的赔率,因为内存正在变得支离破碎.
推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有