【问题标题】:C# Class Instantiation OverflowC# 类实例化溢出
【发布时间】:2010-03-24 08:26:35
【问题描述】:

场景

我有一个 C# Win Forms 应用程序,其中主窗体包含一个循环,该循环创建另一个 CLASS (CLASS B) 的 3000 个实例。在 Form B 中,有大量的属性和字段以及大量的方法来进行大量的处理。

问题

创建 3000 个这样的类会给我带来问题吗?我在考虑内存异常?我已经有 1 或 2 个,而且我也有一个例外,上面写着“发生了爆炸,这通常是其他地方的内存损坏的迹象”。

设置

我正在使用 DevExpress 功能区表单,但我还没有在任何东西上实现 Dispose....我需要吗?

非常感谢您的帮助。

编辑 - 我从来没有说 3000 个表格......我的意思是说我有一个表格可以创建另一个类的 3000 个实例......

【问题讨论】:

  • 我会质疑创建 3000 个表单的必要性。严重地。期望用户如何与所有这些表单进行交互?表格还能怎么用?
  • @Konrad Rudolph:拥有无限量的功能,让客户永远无法完成验收测试,非常狡猾的把戏.. :)

标签: c# winforms exception devexpress


【解决方案1】:

3000 个物体一般不算大,但不得不质疑 3000 个形式的合理性。

大概您不会同时向用户显示所有这些,因此更好的方法可能是根据用户的要求打开表单的实例,并使用 DisplayData(..) 方法填充表单所需的数据记录。一个用户不可能同时开3000! 3-5会更合理。

您还应该考虑重新分层应用程序,以便处理逻辑与表单本身分离。如果需要,这将为您提供更大的灵活性来扩展处理层。有一个 MVC / MVP 的谷歌作为初学者。

【讨论】:

    【解决方案2】:

    尝试使用内存分析器运行您的应用程序并查看发生内存泄漏的位置..

    http://memprofiler.com/
    

    【讨论】:

      【解决方案3】:

      您需要阅读this article。您将用完窗口句柄,您确实需要实现并调用 dispose,但正如文章所述,如果您必须询问这个问题,那么您做错了。

      Windows 窗体中的每个控件都有一个唯一的窗口句柄。正如文章指出的那样,每个进程都有 10000 个句柄。句柄是通过调用 dispose 释放的,因此您需要确保您的表单在其子控件上调用 dispose。大多数容器控件会为您处理该部分,但请仔细检查。记住它是每个控件、文本框的一切。

      我以前打过一次。我们有非常复杂的表单,当用户使用它们时会关闭它们,但我们没有正确处理它们。我们急忙达到了句柄极限。它还使我们重新思考用户一次可以真正在精神上处理的信息量,我们简化了表单。

      吸引我们的是我们的自动化验收测试。他们浏览表单的速度比用户快,而且很快就达到了句柄限制。

      EDIT 针对问题的变化

      好吧,如果不是 3000 个表格,你应该没问题。您仍然应该阅读链接,这是一件好事。但是 3000 个实例根本不算多。即使他们每个人都有 1000 个属性,你也应该没问题。作为一个简单的检查,您可以在任务管理器中查看应用程序以确保它正常。

      一般来说,您需要实现IDisposable 并在您的类引用窗口句柄、文件、数据库连接等内容时调用它。我不知道您的 3000 个实例在做什么,所以我无法告诉您如果你在这种情况下需要IDisposable

      【讨论】:

        【解决方案4】:

        我建议考虑享元模式:http://en.wikipedia.org/wiki/Flyweight_pattern 这专门用于处理您通常会创建大量对象并在实际需要时动态创建实例的情况。
        享元的一个示例是使用集合类,例如字典来存储对象需要持久化的所有属性,当您需要与特定对象交互时,享元会提取属性并创建对象动态地,一旦完成,属性将存储回集合中并释放对象引用。

        【讨论】:

          猜你喜欢
          • 2016-03-14
          • 1970-01-01
          • 2019-04-06
          • 1970-01-01
          • 2010-09-07
          • 2021-08-11
          • 2011-05-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多