【发布时间】:2011-02-09 20:45:35
【问题描述】:
我正在从事一个大型项目,其中提供了一个自定义(非常好的和强大的)框架,我们必须使用它来显示表单和视图。
有一个抽象类 StrategyEditor(派生自框架中的某个类),每当打开新的 StrategyForm 时都会实例化它。
StrategyForm(自定义窗框)包含StrategyEditor。StrategyEditor 包含StrategyTab。StrategyTab 包含StrategyCanvas。
这是大类中的一小部分,旨在阐明如果在运行时在内存中分配一个 StrategyForm 对象,将创建许多对象。我的组件拥有上面提到的所有这些类,但 StrategyForm 的代码不在我的控制范围内。
现在,在运行时,用户打开了许多策略对象(这会触发新 StrategyForm 对象的创建)。 44 个策略对象,我们看到应用程序创建的 USER OBJECT HANDLES(我将从这里开始使用 UOH)达到大约 20k+,而在注册表中,句柄的默认数量是 10k。 Read more about User Objects here.在不同机器上的测试表明,打开的策略对象数量不同,弹出消息-一个m/c如果是44,那么在另一个m/c上可以是40。
当我们看到消息弹出时,这意味着应用程序将响应缓慢。对象越少越糟糕,然后创建窗口框架和后续对象失败。
我们首先认为这是内存不足的问题。但是随后reading more about new in C# 帮助理解了如果应用程序内存不足会引发异常。我觉得这不是内存问题(任务管理器也显示了 1.5GB+ 可用内存。)
M/C 规格
酷睿 2 双核 2GHz+
4GB 内存
80GB+ 可用磁盘空间用于页面文件
虚拟内存集:4000 - 6000
我的问题
第一季度。这看起来像内存问题吗?我错了不是吗?
Q2。这是否表明免费 UOH 已用尽(正如我所想的那样)并导致创建窗口句柄失败?
Q3。我们如何避免加载StrategyEditor 对象(超出阈值,密切关注 UOH 的当前使用情况)? (我们已经知道如何获取正在使用的 UOH 数量,所以不要去那里。) 请记住,对 new StrategyForm() 的调用不在我的组件的控制范围内。
Q4。我有点困惑 - 用户对象的句柄到底是什么? MSDN 是在讨论我们创建的任何对象还是仅讨论某些特定对象,例如窗口句柄、光标句柄、图标句柄?
Q5。究竟是什么原因导致 UOH 用完? (几乎与第四季度相同)
我非常感谢任何能给我一些知识渊博的答案的人。非常感谢! :)
[更新]
根据 Stakx 的回答,请注意,正在打开的窗口将仅由用户关闭。这是一种 MDI 应用程序情况,其中打开了太多子窗口。所以,Dispose 不能随时调用。
【问题讨论】:
-
您可能希望在任务管理器下启用名为“Handles”和“GDI Objects”的列并观察会发生什么。我相信 GDI 对象在 Windows XP 上每个进程的最大限制为 10000。请记住,每个带有窗口句柄的可见 UI 控件可能使用多个 GDI 对象,具体取决于其实现方式。
-
没错。是的,我正在监视手柄。虽然我不记得上次的测试结果。明天我会更新最大号码是多少。我的应用程序停止响应时显示的句柄。谢谢!
标签: c# windows c#-2.0 memory-management user-object