在.NET ImageList中实现的ImageList能力的错误?(ImageList capac

2019-09-16 14:19发布

我有利用我在.NET应用程序的ListView一个ImageList一些问题。 在我的实现,这个ImageList中可以根据使用持有几千图像。 这个问题最初出现了,当我试图用大量图像的工作。 一旦我得到过去5K +的图像,我也陷入了一个通用的“图片不能被添加到ImageList”异常尝试添加图像。 发生这种故障,其确切的数字蹦来跳去一点点。

因此,在试图解决这个问题,我一直在努力,扩大使用本地ImageList_SetImageCount功能ImageList中的能力。 那是个好人,我的解决迫在眉睫的问题。 我不得不填充使用的ImageList [索引] =图像代替。新增()方法列表。 这一切都很好,但是,当它来到的时间拉的图像出来,这些问题蹑手蹑脚。现在,只要我在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”错误崩溃。 奇怪的是,第二回路设置为低迭代(即200总共2000张图像的被添加)它的行为就好了。

有没有在.NET上的ImageList一定的阈值,我不知道呢? 任何帮助将不胜感激。

Answer 1:

我可以得到任何不摄制与发布代码。 要认识到的ImageList使位图的副本,然而重要的。 所以,你应该将它添加后调用位图的Dispose()方法。 如果你不那么有一个严重的风险,你会耗尽非托管内存,通过位图数据和致命当垃圾回收器不会运行往往不够后您清理消耗。 由于只有10位图,这并不适用于片段。



Answer 2:

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

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

它涉及带把手,这是在Windows有限的工作(10000每过程中,如果我没有记错)。 所以,虽然你有很多的空闲内存,你可能已经达到了手柄的限制。



文章来源: ImageList capacity bug in .NET ImageList implementation?