Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET ImageList实现中的ImageList容量错误?_.net_Image_Imagelist - Fatal编程技术网

.NET ImageList实现中的ImageList容量错误?

.NET ImageList实现中的ImageList容量错误?,.net,image,imagelist,.net,Image,Imagelist,在.net应用程序中为我的ListView使用ImageList时遇到一些问题。在我的实现中,这个ImageList可以根据使用情况保存几千个图像。这个问题最初是在我尝试处理大量图像时出现的。当我通过5K+图像时,我在尝试添加图像时遇到了一个通用的“图像无法添加到图像列表”异常。发生这种故障的确切数字有点跳跃 因此,为了解决这个问题,我尝试使用原生ImageList_SetImageCount函数扩展ImageList的容量。这很好,解决了我眼前的问题。我必须使用ImageList[index]

在.net应用程序中为我的ListView使用ImageList时遇到一些问题。在我的实现中,这个ImageList可以根据使用情况保存几千个图像。这个问题最初是在我尝试处理大量图像时出现的。当我通过5K+图像时,我在尝试添加图像时遇到了一个通用的“图像无法添加到图像列表”异常。发生这种故障的确切数字有点跳跃

因此,为了解决这个问题,我尝试使用原生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");
private void Form1\u加载(对象发送方,事件参数e)
{
列表=新的ImageList();
list.ImageSize=新大小(128128);
list.ColorDepth=ColorDepth.depth32位;
图像[]图像=新图像[10];
对于(int y=0;y<10;y++)
{
图像[y]=新位图(@“加载路径_photo.png”);
}
对于(int x=0;x<750;x++)
{
list.Images.AddRange(图像);
}
list.Images[12]=新位图(@“Path to other.png”);
最后一行出现“无法将图像添加到ImageList”错误。奇怪的是,将第二个循环设置为更低的迭代次数(即,总共添加2000个图像时,循环次数为200次),它的表现很好


在.net中,ImageList是否有我不知道的某个阈值?如果您能提供任何帮助,我们将不胜感激。

当您使用Reflector查看最后一行代码的功能时,您将看到,ImageList的setter实际上在这一行失败了:

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

它涉及使用Windows有限公司的句柄(如果我没记错的话,每个进程10000个)。因此,尽管您有很多可用内存,但可能已经达到了句柄的限制。

我无法对发布的代码进行任何复制。但是,重要的是要认识到ImageList复制了位图。因此,您应该调用位图的Dispose()方法。如果不这样做,则存在严重的风险,即您将耗尽非托管内存,被位图数据消耗,并且当垃圾回收器没有足够频繁地运行以在您之后进行清理时,将导致致命的后果。这不适用于代码段,因为只有10个位图。

我在这方面没有任何专业知识,但它不是“奇怪”添加更少的图像可以让一切正常工作。你几乎肯定会遇到内存问题,因此使用更少的内存将是避免这一问题的一个好方法。你可能想评测你的应用程序,看看你的内存使用情况如何。我也这么想,但我有空闲的文件。另外,将此imagelist设置为列表视图,会显示所有图像很好。当我试图通过索引访问图像以在其他地方显示它时,内存不足问题出现了。很奇怪。嗯,我不知道我们可以在将
位图添加到
图像列表后处理它。