C# 如何减少连续图形使用的内存量。DrawImage()

C# 如何减少连续图形使用的内存量。DrawImage(),c#,winforms,memory-management,picturebox,C#,Winforms,Memory Management,Picturebox,我正在构建一个应用程序,每3秒钟在图片框上显示一个列表图像中的三个图像中的一个,我这样做的方式是使用 drawing.Image=Image.FromFile(images[1]) 然后我使用图形类来绘制其他两幅图像 void PictureBox_Paint_alarm(object sender, PaintEventArgs e) { if (rotationCounter > images.Count-1) r

我正在构建一个应用程序,每3秒钟在图片框上显示一个列表
图像中的三个图像中的一个,我这样做的方式是使用

drawing.Image=Image.FromFile(images[1])

然后我使用图形类来绘制其他两幅图像

void PictureBox_Paint_alarm(object sender, PaintEventArgs e)
        {
            if (rotationCounter > images.Count-1)
                rotationCounter = 0;
            if (rotationCounter != 1)
                e.Graphics.DrawImage(Image.FromFile(images[rotationCounter]), new RectangleF(0, 0, drawing.Size.Width, drawing.Size.Height));
        }
旋转计数器
每3秒递增1,应用程序按预期运行。然而,我注意到,随着时间的推移,该程序正在消耗更多的内存,直到达到5GB,然后又回到400KB,图像的平均大小为450KB


问题是,我将在一个只有2GB内存的系统上部署这个程序。您有一个
图像
数组(或类似的数组),当前正在存储文件名。不要这样做,只需加载一次图像,并使用这些图像的数组而不是文件名。这样,您就不会不断地从文件中重新加载图像

这也意味着你不会一直创建非常(资源)昂贵的
Image
对象。这些东西实现了IDisposable
,因此在不再需要时就可以处理。相反,你只是让他们坐着,直到他们被垃圾收集起来:

直到它达到5GB,然后又回到400KB,图像的平均大小为450KB

这正是你在这里描述的

问题是我将在一个只有2GB内存的系统上部署这个程序

这不会是一个问题,因为a)程序不分配物理内存,b)当内存压力开始时,垃圾收集器会提前启动。

您可以使用GC.Collect();使用垃圾收集器

另外,如果您已经声明了对象,则可以在使用后使用DeleteObject()将其删除

此链接可能有用:

Image.FromFile
使用
子句编写
?为应用程序分配内存,直到系统中有可用内存为止。因此,
GC
将在2GB RAM计算机上提前启动。您可以处理旧的
绘图。图像
就像分配新图像一样。我将所有三个图像加载到图像列表中,然后用它更新图片框,现在程序需要很长时间才能消耗1 GB的RAM,我将强制每45秒进行一次垃圾收集,以避免程序超过1GB@O.如果您的内存使用量仍在增长,那么您还有其他内存泄漏。例如,因为您将图像作为资源嵌入,并且使用
Properties.Resources.[Image]
作为要绘制的图像的源,因此每次都会生成一个新图像。此外,笔、画笔和字体(以及其他GDI+对象)也需要处理,通常使用
using
语句声明它们。如果正确地绘制图像并处理一次性对象,内存使用不会增加。曾经