asp.net 系统绘图和垃圾收集

fumotvh3  于 2023-10-21  发布在  .NET
关注(0)|答案(5)|浏览(98)

正如有些人可能知道的那样,我最近在我的网站上发布了关于高内存使用的文章,我认为我的缩略图可能与此有关,因为我没有积极地处理由于我误解了它的工作原理而使用的示例。
我现在正在看我的缩略图程序的代码,想知道什么时候需要处理一些东西,只有当你创建一个对象的新示例时才需要处理吗?
比如:

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

所以,我的问题是,我是否需要处理Target和MyImage以确保GC正确地完成它需要做的事情?
谢谢.

r1wp621o

r1wp621o1#

看看这篇在MSDN上的博客文章:.NET Memory Leak: To dispose or not to dispose, that’s the 1 GB question .建议是你应该处理掉。

zfciruhq

zfciruhq2#

作为一项一般政策,我想把这个问题反过来说:
我有什么理由不把这些东西处理掉呢
如果类实现了IDisposable,那么您的工作就是处理它。
在许多情况下,虽然对象在你释放它时并没有做太多的事情,但这并不意味着你不应该对它调用Dispose。如果你升级到一个新的.NET运行时版本,这可能已经改变了。
好吧,让我澄清一下我在这里说的话。
当然,我并不是说你应该在任何实现IDisposable的对象上调用Dispose。问题是,“这是你的目标吗?”如果你建造了它,这是你的责任。
如果有人给了你一件物品,就假设它不是你的,除非你特别要求别人给你一件物品,而不仅仅是暂时借给你。
当然也有其他的例外,但是 * 作为一般规则 *,你拥有的实现IDisposable的对象,当你完成的时候就把它们处理掉。

zmeyuzjn

zmeyuzjn3#

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

ryevplcw

ryevplcw4#

是的,这两个调用都会导致创建新的Bitmap对象,因此在处理完它们之后需要释放它们。
您还应该知道,您可能正在使用的其他图形相关对象也需要被处理,如GraphicsBrushFont

utugiqy6

utugiqy65#

,丢弃您创建的IDisposables。在GDI+中

最好在using() {}块中。

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

相关问题