System.Drawing 和垃圾收集

问题描述 投票:0回答:5

有些人可能知道,我最近在我的网站上发布了关于内存使用率过高的信息,我认为我的缩略图可能与此有关,因为由于我的误解,我在使用实例时没有积极处置该实例怎么运行的。

我现在正在查看缩略图程序的代码,并希望获得一些有关何时实际需要处置某些东西的建议,是否仅在创建对象的新实例时?

喜欢:

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

所以,我的问题是,我是否需要处理 Target 和 MyImage 以确保 GC 正确执行其需要执行的操作?

谢谢。

.net asp.net memory-management
5个回答
5
投票

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


4
投票

作为一项一般政策,我会彻底改变这个问题:

我有什么理由不应该处理这些特定的物品吗

如果类实现了

IDisposable
,那么你的工作就是处理它。

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

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

当然,我并不是说您应该只对实现

Dispose
的任何和所有对象调用
IDisposable
。问题是,它是你的对象吗。如果你建造了它,那就是你的责任。

如果您获得了该物品,请假设它不是您的,除非您特别要求提供该物品,而不仅仅是暂时借给您。

当然也有其他例外,但是作为一般规则,您拥有的实现

IDisposable
的对象,在完成后将其丢弃。


2
投票

Image
实现一次性。用完后应该将其丢弃。对于图像来说,处理它们非常重要。它们只分配几个字节的托管内存,但引用一大块本机内存。


2
投票

是的,这两个调用都会创建新的

Bitmap
对象,因此您需要在使用完它们后将其丢弃。

您还应该意识到,您可能正在使用的其他与图形相关的对象也需要处理,例如

Graphics
Brush
Font


1
投票

,处置您创建的 IDisposables。当然是在 GDI+ 中

最好是在

using() {}
块中。

using (Pen p = new Pen(Colors.Blue))  // Dispose this pen
{
    Brush b = Brushes.Green; // but not this Brush
    ....
}
© www.soinside.com 2019 - 2024. All rights reserved.