2012-04-16 65 views
2

我在.NET应用程序中为我的ListView使用ImageList时遇到了一些问题。在我的实现中,这个ImageList可以容纳几千个图像,具体取决于使用情况。当我试图处理大量图像时,最初出现这个问题。一旦我越过5K +图像,我遇到了试图添加图像的通用“图像无法添加到ImageList”异常。发生这种故障的确切数字稍微增加了一点。.NET ImageList实现中的ImageList容量错误?

因此,在试图解决这个问题时,我试图使用本机ImageList_SetImageCount函数来扩展ImageList的容量。这很好,解决了我眼前的问题。我必须使用ImageList [index] =图像而不是.Add()方法填充列表。 这一切都很好,但是当把图像拉出来的时候,问题就出现了。现在,无论何时我通过索引引用ImageList中的图像,我都会得到一个Out of Memory Exception。位图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"); 

最后一行崩溃“Image can not be added to ImageList”error。奇怪的是,将第二个循环设置为更低的迭代次数(即,对于总共2000个图像被添加的200),它表现得很好。

在.net中ImageList是否有一定的阈值我不知道?任何帮助将不胜感激。

+0

我在这方面没有任何专业知识,但添加更少图片使一切正常工作似乎并不奇怪。你几乎肯定会遇到内存问题,所以使用更少的内存将是避免这种情况的好方法。您可能需要对应用进行配置,以查看您的内存使用情况。 – dlev 2012-04-16 20:25:40

+0

我也在想,但我有一些演出。另外,将此图像列表设置为列表视图,可以很好地显示所有图像。只是当我试图通过它的索引来访问一张图片时,它会在其他地方显示出现Out of Memory问题。只是奇怪。 – genus 2012-04-16 20:29:32

回答

0

当您使用反射来看看你的代码的最后一行呢,你会看到,ImageList中的是二传其实是失败在这条线:

bool flag2 = SafeNativeMethods.ImageList_Replace(new HandleRef(this.owner, this.owner.Handle), index, new HandleRef(null, handle), new HandleRef(null, monochromeMask)); 

它涉及到带把手,这是在工作Windows有限(如果我正确记得,每个进程10000个)。所以尽管你有很多可用的内存,但你可能达到了手柄的极限。

2

我无法通过发布的代码得到任何回报。然而,认识到ImageList制作位图的拷贝是重要的。所以你应该在添加它之后调用位图的Dispose()方法。如果你不这样做,那么存在一个严重的风险,就是你会用完非托管内存,被位图数据占用,并且当垃圾收集器没有足够频繁地运行以在你之后清理时会致命。这不适用于片段,因为只有10个位图。