#星空云诊所#:云诊所-如何巧妙利用好进度条原创
金蝶云社区-云社区用户g7737637
云社区用户g7737637
23人赞赏了该文章 796次浏览 未经作者许可,禁止转载编辑于2022年12月26日 11:36:42

在星空标准产品中,很多大批量计算,都少不了进度条,但虽然有些进度条不是真实进度,但大家要清楚,即使不是真实进度条,如果没有进度条,不仅仅是客户体验不好,不知道这个在执行过程这么久是否死机了,是否还在执行,其实最重要的一点是客户端与服务端长时间不交互,服务端会认为客户端没响应,会自动终止进程,会造成应用程序不执行,报异常错误,发现有很多二开程序发现超过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;


这个实例完全是根据导入数据的量,循环执行,获取到对应的真正执行的进度,在实际实现时希望能抓住整个执行的关键方法,合理的利用进度条,让进度条更接近真实,这样使用人员和开发的人员也可以在执行过程中掌握执行的情况。

  




赞 23