我怎样才能完全删除图片框(+释放内存)

How can I completely delete PictureBox (+ release memory)

我正在尝试完全删除我的 PictureBox,因为我不再需要它了。我尝试使用 Dispose() 方法,这正确地从表单中删除了 PBox,但没有从内存中删除......在我应用 Dispose() 之后,我创建了一个 PBox 并在其中加载相同的图像,然后调用 Dispose()再次等等...我在 'Diagnostic Tools / Process memory' window 中看到的是每次按下按钮(创建新的 PBox 和将图像加载到其中),但内存永远不会释放...我也尝试使用 Controls.Remove() 方法但我得到了相同的结果!

那么问题来了:如何释放内存,彻底删除一个PictureBox?

编辑: 好的.. 一段时间后,当程序用完大约 1Gb 的内存(通过创建 PBox/Dispose 循环)时,垃圾收集器会自行激活并释放程序使用的几乎所有内存!我误解了它是如何工作的...我认为每次使用 Dispose 方法后它应该有 运行.. 看起来一切都很好,但是在我应用 Dispose 后有没有办法从内存中手动释放 PBox?

通常,您应该调用 Dispose 删除对 PictureBox 的所有引用。一段时间后,GC 将收集此 PictureBox 并释放内存。但是没办法知道,什么时候 正好 GC 会 运行。因此,在 GC 运行 之前内存使用量可能会增加一段时间 - 这是正常的。在大多数情况下,您不应该手动强制 GC 到 运行,但在某些特定情况下,您可以使用 GC.Collect(); 来执行此操作(但绝对不能 recommended

更新 您不能手动“collect/free”只指定对象。只强制GC(并得到所有可能的问题,上面link提到的)。

更好的解决方案可能是重新编写代码以避免重新创建 ImageBox。你可以试试

  • show/hide 单个 ImageBox 并仅替换其中的图像
  • 缓存 ImageBox 对象并从 Controls.Add/Controls.Remove 的表单中 add/remove 它。

由于 loading/disposing 图片,您仍然会占用一些内存,但这可能比重新创建整个 ImageBox 更好