1

我们注意到 Visual Studio c# 中的图像资源有一个奇怪的行为。

如果您将图像添加到项目资源并多次加载图像,您很快就会遇到内存不足的异常。

它只发生在某些系统上(在我测试的每一台 PC 上)。

复制:

  1. 创建 Windows 窗体项目
  2. 将图像添加到项目资源 (32x32 PNG)
  3. 创建一个包含 2000 个循环的 for 循环
  4. 在循环中将图像从资源填充到私有列表

    private List<image> _images = new List<image>();
    private void ButtonClick(object sender, EventArgs e)
    {
        for (int i = 0; i < 2000; i++)
        {
            _images.Add(Properties.Resources.myImage);
        }
    }
    

每次运行循环时都会分配一些内存。在健康的系统上,您可以这样做,直到达到 2GB(32 位应用程序)。

但是在一个生病的系统上。该应用程序已经挂起 200MB。

非常值得注意的是,sik 系统分配的内存与健康系统不同。sik 系统在单次执行循环时只分配大约一半的内存。sik 系统为每个循环分配 50MB。健康系统分配 120MB。

这些系统都完全相同。Core I7、Windows7、12GB RAM、Visual Studio 2012。在 Windows8 上,每个测试系统都会出现内存泄漏。

有没有人注意到同样的奇怪行为?

4

1 回答 1

0

我们发现了一些有趣的东西。

问题与 Internet Explorer 10 有关。这也解释了为什么泄漏出现在每个 Windows8

卸载 IE10 没有帮助。如果您卸载 Windows Update KB2670838,它会有所帮助。

顺便说一句……这段代码也有同样的问题。

Image.FromFile("myImage.png");

所以问题似乎出在 GDI+ 而不是 ResourceManager 中。

于 2013-04-16T06:00:08.627 回答