有些人可能知道,我最近在我的网站上发布了关于内存使用率过高的信息,我认为我的缩略图可能与此有关,因为由于我的误解,我在使用实例时没有积极处置该实例怎么运行的。
我现在正在查看缩略图程序的代码,并希望获得一些有关何时实际需要处置某些东西的建议,是否仅在创建对象的新实例时?
喜欢:
Target := System.Drawing.Bitmap.Create(Trunc(Width), Trunc(Height));
MyImage := Target.FromFile(PhotoPath);
所以,我的问题是,我是否需要处理 Target 和 MyImage 以确保 GC 正确执行其需要执行的操作?
谢谢。
查看 MSDN 上的这篇博文:.NET 内存泄漏:处置还是不处置,这就是 1 GB 问题。建议似乎是您应该丢弃。
作为一项一般政策,我会彻底改变这个问题:
我有什么理由不应该处理这些特定的物品吗
如果类实现了
IDisposable
,那么你的工作就是处理它。
在许多情况下,虽然对象在处置时不会做太多事情,但这并不意味着您不应该对其调用 Dispose。如果您升级到新的 .NET 运行时版本,情况可能会发生变化。
好吧,让我澄清一下我在这里说的话。
当然,我并不是说您应该只对实现
Dispose
的任何和所有对象调用 IDisposable
。问题是,它是你的对象吗。如果你建造了它,那就是你的责任。
如果您获得了该物品,请假设它不是您的,除非您特别要求提供该物品,而不仅仅是暂时借给您。
当然也有其他例外,但是作为一般规则,您拥有的实现
IDisposable
的对象,在完成后将其丢弃。
Image
实现一次性。用完后应该将其丢弃。对于图像来说,处理它们非常重要。它们只分配几个字节的托管内存,但引用一大块本机内存。
是的,这两个调用都会创建新的
Bitmap
对象,因此您需要在使用完它们后将其丢弃。
您还应该意识到,您可能正在使用的其他与图形相关的对象也需要处理,例如
Graphics
、Brush
和 Font
。
是,处置您创建的 IDisposables。当然是在 GDI+ 中
最好是在
using() {}
块中。
using (Pen p = new Pen(Colors.Blue)) // Dispose this pen
{
Brush b = Brushes.Green; // but not this Brush
....
}