我在Windows窗体中使用了PictureBox中的gif图像。 当我运行我的应用程序时,应用程序的内存使用率不断上升。
代码是:
pictureBox2.Image = Image.FromFile("image.gif");
我怎么能摆脱这种情况? 谢谢!
答案 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);