为耗时功能增加进度条防止执行超时原创
金蝶云社区-战斗的凯文
战斗的凯文
14人赞赏了该文章 191次浏览 未经作者许可,禁止转载编辑于2024年11月04日 10:27:33

前端操作一般默认超时时间为5分钟,也就是说,通常情况下,一个前端操作,如果执行超过5分钟,系统就会报错,提示超时并终止操作。为了解决这个问题,方法之一就是为操作增加一个进度对话框,进度条的存在,可以有效防止操作超时。本文介始的进度对话框方式,可以不需要修改元数据,纯代码实现,比较方便。

image.png

以下为示例代码

        //功能方法入口
        private void DoOperation(List<DynamicObject> lstSelectedBook)
        {
            //显示一个进度条对话框
            var processForm = this.View.ShowProcessForm(new Action<FormResult>(t => { }), true, "操作正在进行中。。。");
            processForm.HiddenCloseButton = true;
            //开始一个新的线程任务,
            (new Thread(DoOperationTask)).Start(lstSelectedBook);
        }
        
        /// <summary>
        /// 真实执行操作的任务
        /// </summary>
        private void DoInputTask(object lstSelectedBook)
        {
            //新线程入口一定要Catch异常,防止整个系统崩溃
            try
            {
                System.Threading.Thread.CurrentThread.CurrentCulture = this.Context.UserLocale;
                //参数类型转型回来
                List<DynamicObject> lst = lstSelectedBook as List<DynamicObject>;
                if (lst == null && lst.Count <= 0) return;
                //进度位置归0
                this.View.Session["ProcessRateValue"] = 0;
                //开始进度条的进度
                StartTimer();
                //每一次循环前进的进度
                var step = 100 / (lst.Count);
                。。。
                //执行耗时操作。。。。。。                
                //进度对话框上的提示信息更新
                this.View.Session["ProcessTips"] = "正在做。。。。";
                //进度位置更新
                this.View.Session["ProcessRateValue"] = step * i;
                。。。
            }
            catch (Exception ex)
            {
                Kingdee.BOS.Log.Logger.Error("GL", "操作异常", ex);
                this.View.ShowErrMessage(ex.Message + "\r\n" + ex.StackTrace);
            }
            finally
            {
                //进度条跑满结束
                this.View.Session["ProcessRateValue"] = 100;
                //进度条停止
                StopTimer();
            }
        }
        
        /// <summary>
        /// 进度条定时器
        /// </summary>
        System.Timers.Timer MyTimer;
        
        private void StopTimer()
        {
            if (MyTimer != null)
            {
                MyTimer.Stop();
            }
        }

        private void StartTimer()
        {
            if (MyTimer == null)
            {
                MyTimer = new System.Timers.Timer(2000);//实例化Timer类,设置间隔时间为2秒;
                MyTimer.Elapsed += new System.Timers.ElapsedEventHandler(ExecuteProcess);//到达时间的时候执行事件;
                MyTimer.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
                MyTimer.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
            }
            MyTimer.Start(); //启动定时器
        }
        
        //定时更新进度信息
        public void ExecuteProcess(object source, System.Timers.ElapsedEventArgs e)
        {
            if (MyTimer != null)
            {
                var iProcessRateValue = Convert.ToInt32(this.View.Session["ProcessRateValue"]);
                if (iProcessRateValue < 100)
                {
                    this.View.Session["ProcessRateValue"] = iProcessRateValue;
                }
            }
        }

只需要对上面的代码做少量修改,就可以直接用你的项目。

希望对你有帮助。

图标赞 14
14人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!