我在 .net 应用程序中为 ListView 使用 ImageList 时遇到一些问题。在我的实现中,这个 ImageList 根据使用情况可以容纳几千个图像。这个问题最初是在我尝试处理大量图像时出现的。当我超过 5K+ 图像时,我在尝试添加图像时遇到了通用的“图像无法添加到 ImageList”异常。发生此故障的确切数字略有波动。
因此,在尝试解决此问题时,我尝试使用本机 ImageList_SetImageCount 函数来扩展 ImageList 的容量。这很好,解决了我眼前的问题。我必须使用 ImageList[index] = image 而不是 .Add() 方法来填充列表。
这一切都很好,但是当需要拉出图像时,问题就出现了。现在,每当我通过索引引用该 ImageList 中的图像时,都会出现内存不足异常。位图 x = ImageList[任何索引] 会崩溃。
我尝试过多种不同的方法,但仍然遇到 ImageList 的问题。
在我最后一次尝试进一步探讨这个问题时,我整理了以下一段测试代码,但它的行为仍然很奇怪!
private void Form1_Load(object sender, EventArgs e)
{
list = new ImageList();
list.ImageSize = new Size(128, 128);
list.ColorDepth = ColorDepth.Depth32Bit;
Image[] images = new Image[10];
for (int y = 0; y < 10; y++)
{
images[y] = new Bitmap(@"Path to loading_photo.png");
}
for (int x = 0; x < 750; x++)
{
list.Images.AddRange(images);
}
list.Images[12] = new Bitmap(@"Path to another.png");
最后一行崩溃并出现“图像无法添加到 ImageList”错误。奇怪的是,将第二个循环设置为较低迭代(即添加 2000 个图像总共 200 个),它的表现就很好。
我不知道.net 中的 ImageList 是否有一定的阈值?任何帮助将不胜感激。
我无法通过发布的代码得到任何重现。然而重要的是要认识到 ImageList 使copy位图的。所以你应该在添加位图后调用它的Dispose()方法。如果您不这样做,那么您将面临严重的风险,即您将耗尽非托管内存,这些内存将被位图数据消耗,并且当垃圾收集器运行频率不足以在您之后进行清理时,将导致致命的风险。这不适用于代码片段,因为只有 10 个位图。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)