在.net应用程序中为我的ListView使用ImageList时遇到了一些问题。在我的实现中,根据使用情况,这个ImageList可以保存几千张图像。这个问题最初是在我尝试处理大量图像时出现的。一旦我通过5K+图像,我就遇到了一个通用的“图像不能被添加到ImageList”异常,试图添加一个图像。发生此故障的确切数字跳跃了一点。
因此,为了解决这个问题,我尝试使用本机ImageList_SetImageCount函数来扩展ImageList的容量。这很好,解决了我眼前的问题。我必须使用ImageListindex =图像而不是.Add()方法来填充列表。这一切都很好,但当需要提取图像时,问题就悄悄出现了。现在,每当我通过索引引用ImageList中的图像时,我都会得到一个内存不足异常。位图x= ImageListany索引将崩溃。
我已经尝试了许多不同的方法,但仍然遇到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");最后一行崩溃,并显示"Image cannot be added to the ImageList“错误。奇怪的是,将第二个循环设置为较低的迭代(例如,对于总共添加的2000张图像,设置为200 ),它的行为刚刚好。
在.net中有没有某个我不知道的ImageList阈值?任何帮助都将不胜感激。
发布于 2012-04-17 08:30:06
我不能得到任何再现与张贴的代码。但是,重要的是要认识到,ImageList制作了位图的副本。因此,您应该在添加位图之后调用它的Dispose()方法。如果不这样做,那么您将面临严重的风险,即耗尽非托管内存,被位图数据消耗,并且当垃圾收集器运行的频率不足以清理您之后的内存时,这将是致命的。这不适用于代码段,因为只有10个位图。
发布于 2012-04-17 04:46:35
当你使用Reflector查看最后一行代码的功能时,你会发现ImageList的设置器在这一行实际上失败了:
bool flag2 = SafeNativeMethods.ImageList_Replace(new HandleRef(this.owner, this.owner.Handle), index, new HandleRef(null, handle), new HandleRef(null, monochromeMask));它涉及到处理句柄,这些句柄在Windows中是有限的(如果我没记错的话,每个进程10000个)。因此,尽管您有大量的空闲内存,但您可能已经达到了句柄的限制。
https://stackoverflow.com/questions/10180954
复制相似问题