在C#.net应用程序中创建窗口句柄时出错

时间:2013-03-27 14:26:48

标签: c# memory-leaks

项目简介:

我是一名相对初级的程序员。我的应用程序使用C#.netVS2008编写,目标是.net 3.5这是一个相当大的程序(按我的标准),大约200个表单+30个类和50K行代码。程序的一部分从文本文件导入数据,计算一堆东西,并将结果写入Access数据库。

导入过程通常可以运行20分钟或更长时间,具体取决于文本文件中的行数。最终,程序崩溃,我得到“错误创建窗口句柄错误 - 总是在我的代码中的不同位置。当它运行时,它似乎也不断变慢。(分页问题可能?)我的操作系统是XP w / SP3 ,32位,3Gig RAM,如果这很重要。问题也发生在我的W7 64位机器上,带有4Gig的RAM。

我已经阅读了错误并且已经与任务管理器做了一些侦探工作,显然我遇到了内存泄漏。以下是我收集的一些数据。

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()代码,但这没有任何效果。 (也许是因为我做得不对......)

  1. 是否导致问题的对象/内存使用量不断增加?
  2. 如何找出用户对象(类或表单?)正在增长?
  3. 一旦找到它,我该如何解决?
  4. 欢迎任何建议。

2 个答案:

答案 0 :(得分:0)

如果您使用主表单 - 子表单(或mdi表单)结构并注册到主表单事件,则可能会导致已关闭的子窗口永久存在。

您也可以使用内存分析器查看过多创建的对象。

答案 1 :(得分:0)

我建议使用内存分析器,例如ANTS Memory Profiler。我已经非常成功地使用它来准确追踪哪些物体正在生长。

他们有免费试用和walkthrough开始。它们还有一些很好的technical papers,可以更好地理解.NET内存泄漏。