为耗时功能增加进度条防止执行超时原创
14人赞赏了该文章
191次浏览
编辑于2024年11月04日 10:27:33
前端操作一般默认超时时间为5分钟,也就是说,通常情况下,一个前端操作,如果执行超过5分钟,系统就会报错,提示超时并终止操作。为了解决这个问题,方法之一就是为操作增加一个进度对话框,进度条的存在,可以有效防止操作超时。本文介始的进度对话框方式,可以不需要修改元数据,纯代码实现,比较方便。
以下为示例代码
//功能方法入口 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人打赏
还没有人打赏,快来当第一个打赏的人吧!