【问题标题】:ImageList capacity bug in .NET ImageList implementation?.NET ImageList 实现中的 ImageList 容量错误?
【发布时间】:2012-04-16 20:10:26
【问题描述】:

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

因此,在尝试解决此问题时,我尝试使用本机 ImageList_SetImageCount 函数来扩展 ImageList 的容量。这很好,解决了我眼前的问题。我必须使用 ImageList[index] = image 而不是 .Add() 方法填充列表。 这一切都很好,但是当需要拉出图像时,问题就出现了。现在,每当我通过索引引用该 ImageList 中的图像时,我都会收到内存不足异常。 Bitmap x = ImageList[any index] 会崩溃。

我尝试了很多不同的方法,但仍然遇到 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 是否有一定的阈值?任何帮助将不胜感激。

【问题讨论】:

  • 我在这方面没有任何专业知识,但是添加更少的图像就能让一切正常运行似乎并不“奇怪”。您几乎肯定会遇到内存问题,因此使用更少的内存将是避免这种情况的好方法。您可能需要分析您的应用以查看您的内存使用情况。
  • 我也是这么想的,但我还有空余的演出。另外,将此图像列表设置为列表视图,可以很好地显示所有图像。只是当我尝试通过索引访问图像以将其显示在其他地方时,才会出现内存不足问题。只是奇怪。

标签: .net image imagelist


【解决方案1】:

我无法使用发布的代码进行任何复制。然而,重要的是要意识到 ImageList 会生成位图的副本。所以你应该在添加位图后调用它的 Dispose() 方法。如果您不这样做,那么您将面临一个严重的风险,即您将耗尽非托管内存,被位图数据消耗,并且当垃圾收集器没有足够频繁地运行以在您之后清理时致命。这不适用于 sn-p,因为只有 10 个位图。

【讨论】:

  • 嗯,不知道Bitmap添加到ImageList后可以处理掉。
【解决方案2】:

当您使用 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 个)。因此,尽管您有很多可用内存,但您可能已达到句柄限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2010-10-22
    • 2022-09-26
    • 1970-01-01
    相关资源
    最近更新 更多