zoukankan      html  css  js  c++  java
  • 提高窗体加载效率

    在使用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);

    }

  • 相关阅读:
    Centos 6.5 在 Dell 服务器安装的记录
    【转载】你真的了解补码吗
    【转载】我对补码的理解
    记录一下家里双路由实现wifi漫游功能
    中国大学MOOC | C语言程序设计入门 第8周编程练习 翁恺
    华为卡刷包线刷方法
    串口通信
    端口复用和端口重映射
    软件仿真和硬件仿真
    FPGA之四位LED灯
  • 原文地址:https://www.cnblogs.com/lbzhu/p/7792490.html
Copyright © 2011-2022 走看看