2013-03-27 38 views
0

项目简述:在C#.net应用程序中获取创建窗口句柄的错误

我是一个相对较低级的程序员。我的应用程序使用VS2008并使用VS2008编写,并以.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 

这样继续下去,直到程序崩溃..

˚F rom寻找网络上的答案。我期待看到越来越多的句柄引起这个问题。看来问题是用户对象的数量正在消耗我的内存,也许这最终导致崩溃?发生崩溃时,内存使用量通常在450M到600M之间。

我已经尝试在数据处理过程中多次调用的其中一个类中添加一些.Dispose()代码,但这没有任何效果。 (也许是因为我没有做正确的......)

  1. 是否越来越多的对象/内存使用情况导致该问题?
  2. 如何找出User Object(类或表单?)正在增长的内容?
  3. 一旦我找到它,我该如何解决它?

任何建议将受到欢迎。

+1

抓住这个 - http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/ – 2013-03-27 14:31:24

回答

0

如果您正在使用主窗体子窗体(或mdi窗体)结构并注册到主窗体事件,您可能会导致关闭的子窗口永远活着。

您也可以使用内存分析器查看过度创建哪些对象。

+0

我正在使用一个MDI表单和代码运行的形式是一个孩子的主要形式。当时打开的唯一一个孩子是包含导入过程代码的孩子。它会打开,要求输入文件名,然后处理数据。该表格非常基本,但包含一个进度条,可提醒用户进度。 – user1571430 2013-03-27 14:50:09

0

我会推荐使用内存分析器,如ANTS Memory Profiler。我用它取得了巨大的成功,可以准确追踪哪些物体正在增长。

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