快速优化Windows窗体应用程序
如何加速优化Windows窗体应用程序?
我不是在讨论明显的.NET优化技术 – 比如NGEN -ing,缓存对象等。我已经尝试过了,我要做的是将表单启动时间从1500毫秒减少到500毫秒。
分析已经识别出最慢的代码,并且几乎所有代码都在InitializeComponent
,并且在此方法中最慢的行是
- 创建(只是新增)WebBrowser组件
- 从资源加载图标(可怕的500毫秒)
- 创建
ContextStripMenu
- 几个
this.Controls.Add()
调用贡献很多。
目前,我只能看到如何修复点(2) – 将图标数据从存储为嵌入资源移动到私有字段(例如, Base64编码的字符串)。
我应该怎么做第1,3和4点?
在单独的InitializeComponentAsync
线程中加载图标。
我能想到的唯一可以做的就是重写你想要使用的控件并优化它们以更快地初始化(以及Form
类来优化添加控件添加到表单)。
我不明白这是怎么可行的,而且我认为你会坚持这个,取决于你对这些控制的依赖。
我过去使用的一种技术是multithreading数据加载,以便它同时运行到表单创建。 在这种情况下,数据从AD加载,它减少了大约1/3的加载时间。
我已经改变了表单加载的策略,这将在表单加载时间上做出很大的改变,现在它平均需要37毫秒而不是466毫秒。
方法:On第一次单击Top-tab / Icon,应用程序在该选项卡/图标下加载所有表单,然后单击Form Icon,它将仅切换可见性。 再次访问Top-tab不会加载该选项卡下的表单。
-
在我拍摄时,只需要像
ClsAppearance.cs
这样的另一个类。 -
初始化所有控件,如
static Infragistics.Win.Appearance txtBoxMidAppr = null;
如果是
appiarance1
我会使用自己的名字,如appiarance1
。 由于它可以用于所有文本框,只需一次初始化。 -
创建一个函数,我们可以初始化外观并在MDI / Main表单上只调用一次。
public static void LoadAll() { txtBoxMidAppr = new Infragistics.Win.Appearance(); }
-
在这里制作另一个function并从设计窗口中获取外观代码
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; } }
-
在表单的设计代码中,注释文本框的所有外观设置,并从
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;
获取所有控件外观并在类中创建一个函数并从那里调用它。
所以外观初始化只会进行一次并且可以使用很多次。
你可以为你的Webbrowser控件进行延迟加载吗? 如果它位于不是主视图的选项卡中,则可以在激活该选项卡时加载webbrowser。
或者你可以加载表单,然后加载webbrowser(这可能会帮助你先显示一些东西然后显示所有内容,就像你在网站上做的那样)。