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

C# windows窗体应用程序中的Gif图像导致内存泄漏,c#,winforms,gif,C#,Winforms,Gif,我在windows窗体的PictureBox中使用了gif图像。 当我运行应用程序时,应用程序的内存使用率不断上升 代码是: pictureBox2.Image = Image.FromFile("image.gif"); 我怎样才能摆脱这种局面? 谢谢 如果查看,您将看到该类实现了System.IDisposable 这意味着该类的设计者希望鼓励您主动确保在不再需要图像时调用Dispose()。这样做的原因是因为类的设计者使用了一些稀缺的资源,如果在不再需要对象时立即释放这些资源就好了 在你

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

代码是:

pictureBox2.Image = Image.FromFile("image.gif");
我怎样才能摆脱这种局面? 谢谢

如果查看,您将看到该类实现了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);
}
现在,无论出于何种原因,如果using块被保留,无论是正常保留,还是异常保留,还是在返回后保留,都会调用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);

至少放置stacktrace。如果内存已满,GAC将清除它。否则,如果(pictureBox2.Image!=null){pictureBox2.Image.Dispose()}不能确切确定picturebox.Image的机制是什么。但可能是垃圾收集器并不认为有必要释放内存,所以它一直在上升。我在任务管理器中观察到内存使用情况,其他一切都很好,但问题是,当我查看任务管理器时,我的应用程序内存使用情况正在增加。