在星空标准产品中,很多大批量计算,都少不了进度条,但虽然有些进度条不是真实进度,但大家要清楚,即使不是真实进度条,如果没有进度条,不仅仅是客户体验不好,不知道这个在执行过程这么久是否死机了,是否还在执行,其实最重要的一点是客户端与服务端长时间不交互,服务端会认为客户端没响应,会自动终止进程,会造成应用程序不执行,报异常错误,发现有很多二开程序发现超过5分钟,没有进度条就会执行自然中断,报执行异常。所以对于大批量计算等执行过程,必须加上进度条,并且能做到准确进度条是最好的,这样用户就会清晰的知道已经执行到哪里了,那下面就跟大家分享一下真实进度条如何去实现,希望开发人员能在批量处理环节,能利用好进度条,尽量编写一些真实进度条,能让使用体验有大幅度提升。
一、进度条的原理介绍:
利用异步执行,服务端更新SESSION执行情况,在客户端进行定期更新执行状态,就体现为进度条的执行完成比例。
二、进度条的具体写法:
(1)使用系统本身定义好的进度条控件,不用自己再加进度条控件,并让进度的初始值为0,如下:
//processForm.
// 增加批量生成进度条
var processForm = this.View.ShowProcessForm(new Action<FormResult>(t => { }), true, "正在批量导入MES发货单,请稍候...");
this.View.Session["ProcessRateValue"] = 0;
(2) 异步执行需要批量处理的方法,这里以写的导入方法作为实例,具体如下:
Kingdee.BOS.KDThread.MainWorker.QuequeTask(
() =>
{
try
{
// TODO: 异步处理
ImportData();
}
catch (Exception ex)
{
this.View.ShowErrMessage(ex.StackTrace, Kingdee.BOS.Resource.ResManager.LoadKDString("引入过程遇到未知错误:", "002013030003985", Kingdee.BOS.Resource.SubSystemType.BOS) + ex.Message);
}
finally
{
var processView = this.View.GetView(processForm.PageId);
this._importing = false;
this.View.StyleManager.SetEnabled("F_PEIZ_IMPORT", "uploadLock", true);
processView.Close();
}
},
(asynResult) =>
{
if (asynResult != null && asynResult.Exception != null)
{
this.View.ShowMessage(ResultSucessInfo + "\n" + ResultErrInfo);
this.View.ShowMessage(asynResult.Exception.Message);
this.View.SendDynamicFormAction(this.View);
}
else if (asynResult.Success)
{
this.View.Session["ProcessRateValue"] = 100;
processForm.Caption = "MES发货单导入完成";
}
//TODO : 异步处理完毕,进行收尾
});
上面实例代码中要特别注意的是异常时的处理方法,否则进度条异常后会关闭不掉,异常后,需要执行 processView.Close();关掉进度条。并且在执行方法里需要将this.View.Session["ProcessRateValue"] = 100;
(3)具体执行方法里,需要跟对应的进度赋值,这里以导入方法 ImportData();里在循环执行时,根据导入的记录数进行循环赋值,获取到执行进度,进度条里赋值的方法如下:
int inportcount = ds.Tables[0].Rows.Count;
exportprogressValue = (i + 1) * 100 / inportcount;
this.View.Session["ProcessRateValue"] = exportprogressValue;
这个实例完全是根据导入数据的量,循环执行,获取到对应的真正执行的进度,在实际实现时希望能抓住整个执行的关键方法,合理的利用进度条,让进度条更接近真实,这样使用人员和开发的人员也可以在执行过程中掌握执行的情况。
推荐阅读