优化 Windows Forms 应用程序的速度

4
我如何加速优化Windows窗体应用程序?
我不是在谈论明显的.NET优化技术,比如NGEN,对象缓存等。我已经尝试过了,我现在要做的是将表单初始化时间从1500毫秒减少到500毫秒。
分析已经确定了最慢的代码,几乎所有的代码都在InitializeComponent中,而在这个方法中最慢的行是:
  1. 创建(刚刚新建的)WebBrowser组件
  2. 从资源加载图标(可怕的500毫秒)
  3. 创建ContextStripMenu
  4. 一些this.Controls.Add()调用也贡献了很多。
目前,我只能看到如何修复点(2)- 将图标数据从嵌入式资源存储为私有字段(例如,Base64编码字符串)。
那么,我该怎么处理点1、3和4呢?

1500毫秒只是表单实例化的第一次还是每次都是这样? - Rauhotz
不确定,但想法是消除第一次显示表单的延迟。如果应用程序运行缓慢,可能没有第二次机会。 - Optimizer
这就是启动画面的作用 - 在应用程序首次加载时分散用户的注意力;-) - Steven A. Lowe
6个回答

1
我能想到的唯一方法就是重写你想要使用的控件,并对其进行优化以实现更快的初始化(同时优化Form类以加速将控件添加到窗体中)。
虽然我觉得这个方案并不可行,但如果你在这些控件上有依赖的话,我认为你只能接受现状了。

1

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


0
你能为Webbrowser控件实现延迟加载吗?如果它在不是主视图的选项卡中,那么当该选项卡被激活时,你可以加载Webbrowser。
或者你可以先加载表单,然后再加载Webbrowser(这可能会帮助你先展示一些内容,然后再展示所有内容,就像在网站中所做的那样)。

谢谢。我会试一试。 - Optimizer
尽管缩小规模的代价是我必须牺牲使用 VS 表单编辑器的功能。 - Optimizer

0

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

方法:首次点击顶部选项卡/图标时,应用程序会加载该选项卡/图标下的所有表单,并在点击表单图标时只切换可见性。再次访问顶部选项卡时,不会加载该选项卡下的表单。


0
过去我使用的一种技术是将数据加载进行多线程处理,以便与表单创建同时运行。在这种情况下,数据是从AD中加载出来的,这样可以缩短大约1/3的加载时间。

0
  1. 就像我所做的那样,只需像 ClsAppearance.cs 这样再添加一个类。

  2. 初始化所有控件,例如:

    static Infragistics.Win.Appearance txtBoxMidAppr = null;
    

    我会使用自己的名称,例如 txtBoxMidAppr,而不是 appiarance1。因为这个名称可以用于所有文本框,只需进行一次初始化。

  3. 创建一个函数,在 MDI/主窗体加载时调用它以初始化外观。

    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;
    

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

因此,外观初始化只会进行一次,并且可以多次使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接