【问题标题】:Getting Error creating window handle in C#.net application在 C#.net 应用程序中创建窗口句柄时出错
【发布时间】:2013-03-27 14:26:48
【问题描述】:

项目简介:

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

导入过程通常会运行 20 分钟或更长时间,具体取决于文本文件中的行数。最终,程序崩溃,我得到“错误创建窗口句柄错误 - 总是在我的代码中的不同位置。当它运行时,它似乎也在不断变慢。(可能是分页问题?)我的操作系统是带 SP3 的 XP , 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. 一旦我找到它,我该如何修复它?

欢迎任何建议。

【问题讨论】:

标签: c# memory-leaks


【解决方案1】:

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

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

【讨论】:

  • 我使用的是 MDI 表单,而运行代码的表单是主表单的子表单。当时打开的唯一子项是包含此导入过程代码的子项。它打开,询问文件名,然后处理数据。该表单非常基本,但确实包含一个进度条,用于提醒用户进度。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 2013-12-10
    • 2019-11-19
    • 2011-10-17
    • 1970-01-01
    相关资源
    最近更新 更多