【问题标题】:Application performance when using user controls C#使用用户控件 C# 时的应用程序性能
【发布时间】:2012-10-30 09:36:08
【问题描述】:

我正在开发按功能分为几组的大型应用程序。由于每个功能大部分都是独立的(它们都使用相同的数据库,但不同功能之间没有直接交互),我使用用户定义的控件并将它们视为单独的“应用程序”。应用程序的工作方式是这样的:

  • “root”应用程序仅包含主菜单和 2 个面板。主菜单用于选择功能组。
  • 选择组后(在应用程序启动时自动选择第一个组),该组的功能(由按钮表示)显示在第一个面板中。
  • 用户选择他/她想要的功能(通过单击相应的按钮),并且包含“表单”的用户控件显示在第二个面板中。 显示所有用户控件的代码如下所示:

        panel2.Controls.Clear();
        UserControl1 uc1 = new UserControl1();
        uc1.Location = new Point(0, 0);
        panel2.Controls.Add(uc1);
        label6.Text = "User control 1";
    

因此,当用户选择其中一项功能时,应用程序会清除现有控件并显示选定的控件。 该应用程序运行良好(到目前为止我实现的部分),所以这是我的问题 - 这种方法如何管理计算机资源,主要是内存。具体来说,如果用户使用一个功能,然后切换到另一个功能,.NET 的服务是否会释放前一个功能使用的内存(我认为垃圾收集器负责该功能)以及我使用的 SQL 连接与数据库通信,被关闭? 另外,还有其他一些我应该注意的问题吗? 正如我所说,这些功能可以正常工作,但我距离整个应用程序的全面测试还有很长的路要走(我只在创建它时单独测试每个功能,并且只在我创建它的计算机上,所以我可以'不要将其视为适当的测试)。因此,我担心如果应用程序在较长时间内不断使用,应用程序的性能可能会下降。 我正在使用 VS 2010 (C#) 和 SQL Server 2005 来创建这个应用程序。 如果您有任何建议,请写下来。带着这个问题,一旦由于资源管理不善而进入测试和实施阶段,我试图阻止应用程序的重大重建。 谢谢。

【问题讨论】:

    标签: c# winforms performance


    【解决方案1】:

    垃圾收集器负责释放属于未在任何地方引用的对象的内存。如果您的 Windows 窗体的窗体一次显示许多控件,则它们都以某种方式被当时的窗体引用,因此 GC 不会在此处清理任何内容,您需要注意不要加载这些控件中的对象太多。此外,如果在调用panel2.Controls.Clean() 之前没有正确地Dispose 控件,您可能会遇到内存问题。

    【讨论】:

    • 这正是我要问的——我认为panel2.Controls.Clear() 正在删除控件(不仅从显示器上,而且从内存中)。该应用程序的设计使其一次只显示一个用户控件。那么 Dispose() 方法会释放之前控件使用的内存吗?另外,有没有办法显示在运行时的特定时刻引用了哪些控件?
    • 是的,如果你在之前使用过的控件上调用 Dispose,并且如果这些控件被正确实现(例如它们依次释放自己的组件),则应该释放内存。但是,该方法似乎为您的应用程序增加了不必要的内存管理开销。您是否考虑过为不同的功能使用不同的表单?关闭和处理表单肯定比管理面板更容易。
    • 至于show which controls are referenced at a particular moment during run time,您可能需要使用内存分析工具。在 Web 中搜索 JetBrains dotTraceANTS Memory profiler - 它们对于测量占用内存的内容以及如何修复任何泄漏非常有用。
    • 是的,使用多种形式是我的第一个想法,但我的客户说这种方法“混乱”。此应用程序将由仅具有计算机使用基本知识的用户使用,因此我必须使其尽可能用户友好。使用多个表单可能会让这些用户感到困惑。
    • 哦,我明白了,遗留代码对于任何面临它的人来说都是个大问题。看起来您尝试完成的技巧非常适合 Windows 窗体中 TabControl 的范例,唯一的例外是您不需要选项卡可见。此外,您可能会尝试将您的功能实现为不同的 UserControl,可能源自基类以便于管理。否则,随着您深入开发,您管理 panel2 的代码可能会变得非常复杂且难以维护。
    【解决方案2】:

    我也在创建这样的应用程序。在管理控件时,我遇到了很多困难(请参阅我的 question 在 stackoverflow 上)

    我的期望是应用程序使用的内存会变得很多。您应该关闭不再需要的控件以防止这种情况发生。还有与 SQL 的连接,我建议您手动打开/关闭它们,这样您以后可以确保没有冲突。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多