记一次 加载大量数据时不影响界面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;
        }

 

如果内容对您有帮助,可以扫码给我打赏,你的鼓励是我前进的动力。

 

 

 

 

posted @ 2021-08-20 15:45  业荒于嬉  阅读(100)  评论(0编辑  收藏  举报