"创建窗口句柄时出错"
时间:2020-03-06 14:19:31 来源:igfitidea点击:
我们正在开发一个非常大型的.NET WinForms复合应用程序,而不是CAB,而是一个类似的本地框架。我们正在Windows Server 2003上运行的Citrix和RDP环境中运行。
我们开始遇到随机且难以重现的"错误创建窗口句柄"错误,这似乎是我们应用程序中的老式句柄泄漏。我们大量使用了第三方控件(Janus GridEX,Infralution VirtualTree和.NET Magic对接),并且基于数据库中的元数据进行了大量的动态加载和呈现内容。
Google上有很多有关此错误的信息,但是关于如何避免出现此问题的建议却不多。
对于构建易于处理的winforms应用程序,stackoverflow社区是否对我有什么好的指导?
解决方案
我已经跟踪了很多UI无法按WinForms预期卸载的问题。
以下是一些一般性提示:
- 很多时候,控件将保持使用状态,因为控件事件未正确删除(工具提示提供者在这里给我们造成了很大的问题)或者控件未正确处置。
- 在所有模式对话框周围使用"使用"块,以确保将其丢弃
- 有一些控件属性会在必要之前强制创建窗口句柄(例如,设置TextBox控件的ReadOnly属性将强制实现该控件)
- 使用.Net Memory Profiler之类的工具来获取所创建类的计数。此工具的较新版本还将跟踪GDI和USER对象。
- 尝试最小化Win API调用(或者其他DllImport调用)的使用。如果确实需要使用互操作,请尝试以使using / Dispose模式正常工作的方式包装这些调用。
我正在使用Janus控件。就处置自己而言,它们是极度越野车。我建议我们确保正确处理它们。另外,与它们的绑定有时不会释放,因此我们必须手动取消绑定对象以处置控件。