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

标签 .net image imagelist

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

因此,在尝试解决此问题时,我尝试使用 native 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 是否有我不知道的特定阈值?任何帮助将不胜感激。

最佳答案

我无法通过发布的代码获得任何重现。然而,重要的是要意识到 ImageList 制作了位图的副本。所以你应该在添加之后调用位图的 Dispose() 方法。如果不这样做,则存在严重的风险,即您将耗尽非托管内存,被位图数据消耗,并且当垃圾收集器运行不频繁而无法在您之后进行清理时会致命。这不适用于代码段,因为只有 10 个位图。

关于.net - .NET ImageList 实现中的 ImageList 容量错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10180954/

相关文章:

.net - .NET 网站处理高流量的最佳方式

C# 从另一个程序启动一个程序

.net - 将 C# 对象序列化为 XML - 最快的方法?

java - 在 Oracle 数据库中使用 JSP 和 Servlet 上传图像

php - Base64 编码 PHP 生成的图像,而不将图像写入磁盘

C# listview imagelist 快速添加多个项目

c# - COM 无法启动编译为 AnyCPU 的进程外 .Net 服务器

c# - 保存位图时内存泄漏?

c# - 如何在代码中将图像文件添加到图像列表?

.net - 更改 ImageList 的 ImageSize 属性显示空白图像