提高窗体加载效率

在使用InputPanel时,创建实例消耗大量的时间,造成弹出窗体延迟非常高,现在解决了这个问题,主要使用两个技术

1.延迟加载(在使用时加载)

2.异步加载(另开线程加载)

3.大量控件出现在一个winform里面,一般的做法都是使用gdi+自己画控件出来,而且还得加上双缓冲。
每一个控件,你new一个,都占用不少资源,但是你画出来的话,资源占用就成倍缩小。

-----这是看到某个网友说的,具体做法有时间再整理。关键词:GDI画控件,双缓存

使用这两个办法都可以减少窗体的延迟。

-----------------------------------------------------回来解决这个问题

首先了解了一下双缓存,基本上是将页面要显示的图像效果先使用Graphics画到内存中,然后画到窗体界面上,双缓存并不会提高加载速度,根据网上的说法,一次性将画面给窗体,基本是用来解决窗体闪烁的。

所以,这个方法,个人没感受到卵用。然而,这个不new,只画,不太理解什么意思,不new怎么用。

4.终极大杀器,这个是从老板那学来的,感觉很有用。就是加进度条,进度条,进度条,哈哈。

如果是确实非常耗时的操作,从技术方向做出的努力是有限的,给用户加一个进度条,用户就感受不到窗体卡死了,对于这个等待就舒服很多,亲测非常实用。

 5.补充12/1日:先设置默认样式,然后将与默认不同的表格单独设置样式,适用于需要刷每个单元格样式的情况,这样可以减少设置样式的表格数量。TextControl,使用Selection先整体设置样式,很快,然后对个别不符合的单元格设置样式,这想法牛逼(实际测试、把一个非常卡、不支持手动控制渲染的控件,速度提到飞起。//主要是同过一个巧妙方法绕过了对单元格的设置,就是利用selection,选中表格对整体表格进行设置、然后选中列,对列样式进行设置,最后对少数单元格格式不为空的单元格设置格式,速度逆天)

具体使用方法:

延迟加载:

private Lazy<bool> LazyLoadDoc { set; get; }
private void InitLazyLoad()
{
     LazyLoadDoc = new Lazy<bool>(LoadDoc);
}

在使用的地方直接调用 LazyLoadDo.Value就可以,如果是第一次加载,则会创建实例并返回,如果已经加载过了,就不会重复加载,只在调用时加载,并且不会重复加载,非常省心。

异步加载:

private void InputPanel_Load(object sender, EventArgs e)
{
var thread = new Thread(InstanceControls);
thread.Start();

}//执行完Load方法,界面即可显示不来,Thread单独运行,(设不设为后台线程都可)

//实例化控件(注意:因为此处执行是单独线程,与主线程不是同一线程,所以不能与主界面进行交互,本方法只完成费时的实例化过程,与主界面交互过程最后仍委托主线程完成)
private void InstanceControls()
{

//此处是使用了延迟加载,避免重复实例化浪费系统开销

var table2 = TableConfigPage2.Value;
var table3 = TableConfigPage3.Value;

}

     private Lazy<C1.Win.C1Command.C1DockingTabPage> TableConfigPage3 { set; get; }

    TableConfigPage3 = new Lazy<C1.Win.C1Command.C1DockingTabPage>(InitTablePage3);

在InitTablePage3使用新Thread完成实例化后,因为与主线程不是同一线程所以不能直接与界面进行交互,需要委托给主线程,这个需要注意。

   private C1.Win.C1Command.C1DockingTabPage InitTablePage3()

{

...

//实例化panel

//耗时操作、实例化使用新线程执行

Instance...

...

//界面交互委托给主线程执行

this.Invoke(new AddControlDelegate(AddControls),new object[] { panel });

}

private delegate void AddControlDelegate(C1.Win.C1InputPanel.C1InputPanel Panel);

private void AddControls(C1.Win.C1InputPanel.C1InputPanel Panel)

{

this.DockTabPage1.Controls.Add(Panel);

}

原文地址:https://www.cnblogs.com/lbzhu/p/7792490.html