最近在做医保的接口工作,其中有一个功能点是实现协议机构目录和医保中心目录对照的工作,医保中心目录中药品就是十几万条。
最初该界面的设计方案是加载数据时阻塞界面,显示 一个数据加载中的界面,让用户等待数据加载完再操作,但是这就有一个问题,我每次要对照时,就得打开界面等它加载 好几分钟,这个时候我也不能操作其他界面,做其他工作。
觉得此处用户体验不佳,于是决定优化,优化方案是 加载数据操作使用委托 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;
}