【发布时间】:2009-06-12 03:08:40
【问题描述】:
在从 ImageList 获取图像时遇到 OutOfMemoryException 我一直无法找到合适的解决方案。
我有一个自定义 ListView 控件,它附加了一个用于绘制 ListViewItems 的事件。然后这会调用一个静态方法,该方法旨在绘制项目。
对于大约 300 个项目的 ListView,每次滚动 ListView 时,我们都会使内存增加大约 100Mb。违规代码已追踪到以下内容:
Image image = item.ImageList.Images[item.ImageKey];
if (image != null)
{
Size imageOffset = new Size((bounds.Width - image.Width) / 2, 2);
Point imagePosition = bounds.Location + imageOffset;
graphics.DrawImageUnscaled(image, imagePosition);
}
似乎(当然在 WinXP 上)垃圾收集工作不正常,导致内存呈螺旋状上升。我们尝试在代码块之后直接添加 image.Dispose() 来解决问题,但这没有任何效果。
到目前为止,我设法找到的唯一解决方案是在调用 GC.Collect() 的静态方法的末尾。然而,这样做的问题是,它会导致 ListView 缓慢地重新绘制自身,并且在它尝试重新绘制时最终会在屏幕上出现伪影。
有其他人经历过吗?或者知道解决方法吗?
【问题讨论】:
-
我在两个不同的应用程序上遇到过内存不足异常,它们都没有涉及图像或 listView。不幸的是,我能找到的唯一解决方案是每隔一段时间调用 GC.Collect()。
标签: c# winforms image out-of-memory