繁体   English   中英

System.Drawing和垃圾收集

[英]System.Drawing and Garbage Collection

有些人可能知道,我最近在我的网站上发布了大量内存使用情况,并且我知道我的缩略图可能与此有关,因为我在使用它时由于我的误解,我没有主动处理该实例。有用。

我现在正在查看我的缩略图代码,并想知道什么时候实际需要处理的东西,是否仅在创建对象的新实例时?

喜欢:

Target := System.Drawing.Bitmap.Create(Trunc(Width), Trunc(Height));
MyImage := Target.FromFile(PhotoPath);

所以,我的问题是,我是否需要处理Target和MyImage以确保GC能够正确执行它需要做的事情?

谢谢。

查看MSDN上的这篇博文: .NET内存泄漏:处置或不处理,这是1 GB的问题 建议似乎是您应该处置。

作为一般政策,我会把问题转向:

有什么理由我不应该处理这些特定的对象

如果该类实现了IDisposable ,那么处理它就是你的工作。

在许多情况下,虽然在处理它时对象没有做太多,但这并不意味着你不应该在它上面调用Dispose。 如果您曾升级到新的.NET运行时版本,那可能会发生变化。

好的,让我澄清一下我在这里说的话。

当然,我并不是说你应该只调用任何和所有实现IDisposable对象上的Dispose 问题是,这是你的对象吗 如果你构建它,那是你的责任。

如果给你这个物体,假设它不是你的,除非你特别要求给出物体,而不是暂时借给你。

当然还有其他例外情况,但作为一般规则 ,你拥有的实现IDisposable对象,在你完成后处理它们。

Image实现一次性。 你完成后应该把它丢弃。 使用图像处理它们非常重要。 它们只分配几个字节的托管内存,但引用了一大块本机内存。

是的,两个调用都会导致创建新的Bitmap对象,因此您需要在完成它们时对其进行处理。

您还应该知道,您可能正在使用的其他图形相关对象也需要处理,如GraphicsBrushFont

是的 ,处理您创建的IDisposable。 当然在GDI +中

最好是在using() {}块中。

using (Pen p = new Pen(Colors.Blue))  // Dispose this pen
{
    Brush b = Brushes.Green; // but not this Brush
    ....
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM