【问题标题】:Speed-optimise a Windows Forms application速度优化 Windows 窗体应用程序
【发布时间】:2010-10-07 19:08:01
【问题描述】:

如何加速优化 Windows 窗体应用程序?

我不是在谈论明显的 .NET 优化技术——比如NGEN-ing、缓存对象等。我已经尝试过了,我要做的是将表单初始化时间从 1500 毫秒减少到 500 毫秒毫秒。

Profiling 已经识别出最慢的代码并且几乎所有的代码都在InitializeComponent 中,并且在这个方法中最慢的行是

  1. 创建(刚刚更新的)WebBrowser 组件
  2. 从资源加载图标(可怕的 500 毫秒)
  3. ContextStripMenu 的创建
  4. 几个this.Controls.Add() 电话也有很大贡献。

目前,我只能看到如何解决第 (2) 点 - 将图标数据从作为嵌入式资源存储到私有字段(例如,Base64-编码字符串)。

第 1 点、第 3 点和第 4 点我应该怎么做?

【问题讨论】:

  • 1500ms 只是第一次实例化表单还是每次?
  • 不确定,但想法是消除第一次显示表单时的延迟。如果应用速度慢,可能没有第二次机会。
  • 这就是闪屏的用途——在应用程序第一次加载时分散用户的注意力;-)

标签: c# .net winforms optimization


【解决方案1】:

在单独的InitializeComponentAsync 线程中加载图标。

【讨论】:

    【解决方案2】:

    我能想到的唯一你能做的就是重写你想要使用的控件并优化它们以更快地初始化(以及 Form 类来优化将控件添加到表单中) .

    但我看不出这是如何可行的,而且我认为你会被困住,这取决于你对这些控件的依赖。

    【讨论】:

      【解决方案3】:

      我过去使用的一种技术是多线程数据加载,以便它在创建表单的同时运行。在这种情况下,数据是从 AD 中加载出来的,它减少了大约 1/3 的加载时间。

      【讨论】:

        【解决方案4】:

        我改变了表单加载的策略,这将对表单加载时间产生很大的改变,现在平均需要 37 毫秒而不是 466 毫秒。

        方法:第一次单击顶部选项卡/图标,应用程序加载该选项卡/图标下的所有表单,然后单击表单图标,它只会切换可见性。再次访问 Top-tab 将不会加载该选项卡下的表单。

        【讨论】:

          【解决方案5】:
          1. 就像我上过的那样去上另一门课,比如ClsAppearance.cs

          2. 初始化所有控件,如

            static Infragistics.Win.Appearance txtBoxMidAppr = null;
            

            我用我自己的名字,比如txtBoxMidAppr,而不是appiarance1。因为它可以用于所有文本框,只需初始化一次。

          3. 创建一个函数,我们可以在其中初始化外观,并在 MDI/Main 窗体上调用它只加载一次。

            public static void LoadAll()
            {
                txtBoxMidAppr = new Infragistics.Win.Appearance();
            }
            
          4. 这里再做一个函数,取设计窗口的外观代码

            public static Infragistics.Win.Appearance App_txtBoxMidAppr //text_box_small
            {
                get 
                {
                    txtBoxMidAppr.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(93)))), ((int)(((byte)(93)))), ((int)(((byte)(93)))));
                    txtBoxMidAppr.ImageBackground = global::CS_POS.Properties.Resources.text_box_small;
                    txtBoxMidAppr.ImageBackgroundStyle = Infragistics.Win.ImageBackgroundStyle.Stretched;
                    txtBoxMidAppr.ImageHAlign = Infragistics.Win.HAlign.Right;
                    return txtBoxMidAppr;
                }
            }
            
          5. 在表单的设计代码中,将文本框的所有外观设置注释掉,并输入从ClsAppearance.cs类中获取外观的函数名

            //appearance4.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(93)))), ((int)(((byte)(93)))), ((int)(((byte)(93)))));
            //appearance4.ImageBackground = global::CS_POS.Properties.Resources.text_box_small;
            //appearance4.ImageBackgroundStyle = Infragistics.Win.ImageBackgroundStyle.Stretched;
            //appearance4.ImageHAlign = Infragistics.Win.HAlign.Right;
            this.uteNABoth.Appearance = CS_POS.App_Appearance.ClsAppearance.App_txtBoxMidAppr;
            

            获取所有控件的外观并在类中创建一个函数并从那里调用它。

          所以外观初始化只会进行一次,可以使用很多次。

          【讨论】:

            【解决方案6】:

            你能为你的网络浏览器控件做延迟加载吗?如果它位于不是主视图的选项卡中,那么您可以在激活该选项卡时加载 webbrowser。

            或者您可以加载表单,然后加载网络浏览器(这可能有助于您先显示某些内容,然后再显示所有内容,就像您在网站中所做的那样)。

            【讨论】:

            • 谢谢。我会试一试。
            • 虽然缩小尺寸会是我不得不牺牲使用 VS 表单编辑器。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-21
            • 2010-12-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多