• 记一次 加载大量数据时不影响界面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爬虫简单实现,并在java中调用python脚本,将数据保存在json文件中
    封闭类
    对象的复制和数据类成员的解构
    数据类
    Git 标签
    Git 查看提交历史
    [精]Oracle APEX 5.0 入门教程(一) Form表单
    UISearchbar去除背景色的方法,适合iOS5/6/7/8.0beta
    哈希表——线性探測法、链地址法、查找成功、查找不成功的平均长度
    《Android源代码设计模式解析与实战》读书笔记(二十一)
  • 原文地址:https://www.cnblogs.com/FreeLoopPowter/p/15166751.html
Copyright © 2020-2023  润新知