在c# .net应用程序中创建窗口句柄出错
本文关键字:创建 窗口句柄 出错 应用程序 net | 更新日期: 2023-09-27 18:06:12
项目简介:
我是一个相对初级的程序员。我的应用程序是使用VS2008
用C#.net
编写的,目标是。net 3.5。这是一个相当大的程序(按我的标准),大约有200个表单+ 30个类和50K行代码。该程序的一个部分从文本文件导入数据,计算一堆东西,并将结果写入Access数据库。
导入过程通常可以运行20分钟或更长时间,具体取决于文本文件中的行数。最终,程序崩溃了,我得到了"错误创建窗口句柄错误-总是在我的代码中的不同位置。"随着它的运行,它似乎也在不断变慢。(可能是分页问题?)我的操作系统是XP w/SP3, 32位,3Gig RAM。这个问题也发生在我的W7 64位机器上,内存为4Gig。
我已经仔细研究了这个错误,并使用任务管理器做了一些检测工作,显然我正在经历内存泄漏。这是我收集到的一些数据。
startup - memory usage = 48M / Handles = 428 / Threads = 17 / User Objects = 111
1 minute memory usage = 65M / Handles = 520 / Threads = 22 / User Objects = 523
2 minutes memory usage = 81M / Handles = 520 / Threads = 19 / User Objects = 952
3 minutes memory sage = 98M / Handles = 510 / Threads = 19 / User Objects = 1359
4 minutes memory usage = 113M / Handles = 510 / Threads = 18 / User Objects = 1766
直到程序崩溃为止。
从网上寻找答案。我原以为会看到手柄的数量不断增加,从而导致这个问题。似乎问题是用户对象的数量正在吞噬我的内存,也许这最终导致崩溃?当发生崩溃时,内存使用率一般在450M ~ 600M之间。
我尝试在数据处理过程中多次调用的一个类中添加一些. dispose()代码,但没有效果。(也许是因为我没有做对…)
- 是越来越多的对象/内存使用导致了这个问题吗?
- 我如何发现什么用户对象(类或形式?)正在增长?
- 一旦我找到它,我如何修复它?
如果您使用主窗体-子窗体(或mdi窗体)结构并注册到主窗体事件,您可能会导致关闭的子窗口永远存在。
您还可以使用内存分析器来查看哪些对象被过度创建。
我建议使用内存分析器,如ANTS内存分析器。我已经成功地用它来准确地追踪哪些物体在生长。
他们有一个免费的试用版和一个入门指南。他们还有一些很好的技术论文,提供了对。net内存泄漏的更好理解。