Windows窗体中的Gif图像应用程序导致内存泄漏

时间:2016-06-30 12:21:14

标签: c# winforms gif

我在Windows窗体中使用了PictureBox中的gif图像。 当我运行我的应用程序时,应用程序的内存使用率不断上升。

代码是:

pictureBox2.Image = Image.FromFile("image.gif");

我怎么能摆脱这种情况? 谢谢!

1 个答案:

答案 0 :(得分:0)

如果您查看documentation of the image class,您会看到该类实现了 System.IDisposable

这意味着本课程的设计者会鼓励您在不再需要图像时主动确保调用Dispose()。造成这种情况的原因是因为该类的设计者使用了一些稀缺的资源,如果只要不再需要它们就会释放它们会很好。

在你的情况下,稀缺的来源是(其中包括)记忆。

当然垃圾收集器会确保对象被丢弃,但是如果你将它留给垃圾收集器,这将不会很快。通常,您不确定垃圾收集器何时清理内存。

因此,如果您以高节奏加载图像,那么在加载下一张图像之前,您的旧图像不会被垃圾收集的可能性很高。

为了确保尽快处理对象,您可以使用以下内容:

Image myImage = ...
DoSomeImageHandling (myImage)
// myImage not needed anymore:
myImage.Dispose();
// load a new myImage:
myImage = ... // or: myImage = null;

这个问题是如果DoSomeImageHandling抛出异常,则不会调用Dispose。 using语句将处理它:

using (Image myImage = ...)
{
   DoSomeImageHandling (myImage);
}

现在,如果使用了块,无论出于何种原因,无论是正常还是异常,还是在返回或其他什么之后,都会调用myImage.Dispose()。

顺便说一下,在您的情况下,稀缺的来源不仅仅是记忆,只要您不按照以下代码显示

处理图像,文件也会被锁定。
string fileName = ...
Image myImage = new Image(fileName);
DoSomething(myImage);
// my image and the file not needed anymore: delete the file:

myImage = null; // forgot to call Dispose()
File.Delete(fileName);
// quite often IOException, because the file is still in use

正确的代码是:

string fileName = ...
using (Image myImage = new Image(fileName))
{
    DoSomething(myImage);
}
// Dispose has been called automatically, the file can be deleted
File.Delete(fileName);