【问题标题】:How can I completely delete PictureBox (+ release memory)如何彻底删除 PictureBox(+ 释放内存)
【发布时间】:2021-01-09 22:25:47
【问题描述】:

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

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

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

【问题讨论】:

标签: c# winforms memory-management picturebox


【解决方案1】:

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

更新 您不能手动“收集/释放”仅指定的对象。只强制 GC(并解决上面链接中提到的所有可能的问题)。

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

  • 显示/隐藏单个 ImageBox 并仅替换其中的图像
  • 缓存 ImageBox 对象并使用Controls.Add/Controls.Remove从表单中添加/删除它。

由于加载/处理图像,您仍然会获得一些内存流量,但它可能比重新创建整个 ImageBox 更好

【讨论】:

  • 谢谢!我刚刚意识到完全一样的事情! :) 无论如何,谢谢,我不会强制运行 GC,我不需要它,但很高兴知道这个选项!
  • 其实这是一个简单的测试,用来模拟Paint like程序的一些特性。在这种情况下,“新”功能..当用户开始一个新文件/图像然后绘制一些东西并再次单击“新”(使用新大小)然后再次绘制......就像在PS或Paint等中一样......所以这就是为什么我要删除 + 创建新 PBox.. 来模拟“新建”按钮的行为。但此时我才意识到我应该清除 PBox 上的图像,然后重新调整它的大小 + 设置位置,而不是重新创建完整的 PBox...嗯谢谢!
猜你喜欢
  • 2016-05-31
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 2017-12-24
  • 2018-10-23
  • 1970-01-01
相关资源
最近更新 更多