zoukankan      html  css  js  c++  java
  • 记一次 加载大量数据时不影响界面UI的经历

    最近在做医保的接口工作,其中有一个功能点是实现协议机构目录和医保中心目录对照的工作,医保中心目录中药品就是十几万条。

    最初该界面的设计方案是加载数据时阻塞界面,显示 一个数据加载中的界面,让用户等待数据加载完再操作,但是这就有一个问题,我每次要对照时,就得打开界面等它加载 好几分钟,这个时候我也不能操作其他界面,做其他工作。

    觉得此处用户体验不佳,于是决定优化,优化方案是 加载数据操作使用委托 BeginInvoke方法,利用多线程来实现,数据查询完成后利用BeginInvoke的CallBack委托来通知界面控件加载数据进行显示。

    这里主要展示一下改动处的代码:

    1、定义用到的委托和变量 标记数据是否完成加载的变量可以不用定义,实际后面流程没使用到,最开始想作为跟async返回结果做比较的

     2、第二处是调用委托的主要代码,其中第一处框出的内容可以判断数据是否加载完成,避免用户关闭界面或重新点查询操作。

    3、

           /// <summary>
            /// 委托执行完毕后的执行的方法
            /// </summary>
            private void AcceptChangesCallBack(IAsyncResult asyncResult)
            {
                AsyncResult result = (AsyncResult)asyncResult;
                NoReturnDelegate del = (NoReturnDelegate)result.AsyncDelegate;
                del.EndInvoke(asyncResult);

                //如果有操作控件例 此处的线程判断一定要加上,不然会出现程序异常
                if (this.fpCenterItem.InvokeRequired)
                {
                    this.Invoke(new MethodInvoker(delegate() { ShowCenterData(); }));
                }
                else
                {
                    ShowCenterData();
                }

                isCompleteData = true;
            }

            /// <summary>
            ///
            /// </summary>
            private void ShowCenterData()
            {

        //用于数据查询完毕后给控件赋值,显示在界面上

               //dvCenterItem是一个DataTable类型的全局变量,数据查询完会给该变量赋值
                fpCenterItem_Sheet1.DataSource = dvCenterItem;
            }

  • 相关阅读:
    手指抽搐强迫症 之 APM病理分析器 v0.0.0.3 (11月24日更新)
    [转帖]修改MySql密码及访问限制设置详解
    C#学习笔记
    CodeSmith快速向导
    奇葩的maxscript
    MASM中可以定义的变量类型
    js琐记
    史上最全的css hack(ie69,firefox,chrome,opera,safari)
    逆向win32程序的思路琐记
    makefile伪目标
  • 原文地址:https://www.cnblogs.com/FreeLoopPowter/p/15166751.html
Copyright © 2011-2022 走看看