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;
            }

  • 相关阅读:
    Python-单例模式
    Django 内置模板标签和过滤器
    Python Built-in Function 学习笔记
    Django 中间件
    Django Form
    Ajax
    Django中cookie和session
    Django中的QuerySet
    Django模型和ORM
    wordpress添加子主题
  • 原文地址:https://www.cnblogs.com/FreeLoopPowter/p/15166751.html
Copyright © 2011-2022 走看看