【问题标题】:TabVisible workaround - memory leakingTabVisible 解决方法 - 内存泄漏
【发布时间】:2010-08-06 15:06:28
【问题描述】:

我正在尝试实现增强的 TabControl/TabPage 类,以实现真正的 TabVisible 功能,因为 TabPage 的 Visible 属性无法按预期工作。

我正在使用 C#/WinForms/VS2005/.Net FW 2.0;我以这种方式实现了代码:

http://csharp.pastebin.com/AUnzRQLw

我制作了一个表单来测试它,选中/取消选中复选框以显示/隐藏我添加的一些 VisibleTabPage 控件 (http..//csharp.pastebin.com/MkGJGx2G)。但是,经过一个 在 CheckBox 上点击一定次数,以随机顺序,应用程序开始分配越来越多的内存,并使用相当多的 CPU 来显示/隐藏 TabPage 控件。

谁能指出错误在哪里?

【问题讨论】:

  • 我建议在复选框状态发生更改时验证您是否正在重新初始化标签页。验证这一点的最佳方法是下载任何好的分析器(Windbg 等)并找出内存中存在哪些对象。
  • 是的,我使用了内存分析器,发现 ArrayList 对象是罪魁祸首。我创建了一个私有 ArrayList,我在 TabControlEx 对象的整个生命周期中都维护它,这解决了问题。

标签: c# winforms visible tabpage


【解决方案1】:

这有点太多的代码难以解决。但是,我看到您使用 Remove() 和 Clear() 之类的方法,而您从未为标签页调用 Dispose() 方法。这些页面被“停放”并将继续使用系统资源。运行 Taskmgr.exe,进程选项卡,查看 + 选择列,勾选 User32 对象。您可能会看到这个数字无限制地上升,因为您的代码正在泄漏标签页及其所有控件的句柄。

【讨论】:

  • 我发现了这个错误,它是初始化了很多次的 ArrayList。我创建了一个私有 ArrayList,我在 TabControlEx 对象的整个生命周期中都维护它,这解决了这个问题。无论如何感谢您的提示。
猜你喜欢
  • 1970-01-01
  • 2013-04-01
  • 2011-08-14
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 2012-08-19
  • 1970-01-01
相关资源
最近更新 更多