.NET 请求被挂起,前端轮询,委托

起因:因项目需要监控方法中计算进度,故而想通过AJAX调用,返回前端显示进度,结果开发中遇到第二个AJAX请求被挂起,需要等到第一个请求(计算)完成后,才会被处理到。

百度种种,知其原因是在Session上,但因项目过大,不敢随意删除Session。故而只能将后台计算方法放入线程,用委托的方式异步调用该计算方法,前端进行AJAX轮询,实时

检查计算进度。

轮询:setInterval  关闭clearInterval

委托Delegate的BeginInvoke是用于异步执行方法,Invoke是同步执行方法,EndInvoke会阻塞线程,直到方法执行完毕。

 

 1 <script type="text/javascript">
 2                 var si;
 3                 function GenerateSalary() {
 4                     $("#btnGenerateSalary").attr("disabled", "disabled");
 5                     $("#btnGenerateSalary").text("生成中..");
 6                     $("#btnGenerateSalary").hide();
 7                     //$("#btnSeeProceess").show();
 8                     $("#LoadingBg").show();
 9                     $("#salaryLab").show();
10                     $.post("/AbnormalRoll/GenerateSalary", "date=" + $("#SalaryYear").val() + "-" + $("#SalaryMonth").val() + "&isNew=" + $("#chkIsNew").prop("checked"), function (d) {
11                         si=setInterval(GetTotalNum, 1000);
12                     });
13                 }
14 
15                 function GetTotalNum() {
16                     $.post("/AbnormalRoll/GetTotalNum", "type=1", function (d) {
17                         $("#totalNum").val(d.total);
18                         $("#surplusNum").val(d.surplus);
19                         if (d.total == d.surplus) {
20                             clearInterval(si);
21                             $("#LoadingBg").hide();
22                             $("#salaryLab").hide();
23                             $("#btnGenerateSalary").show();
24                             $("#btnGenerateSalary").text("生成工资");
25                             $("#btnGenerateSalary").removeAttr("disabled");
26                         }
27                     });
28                 }
29             </script>
/// <summary>
        /// 生成工资信息
        /// </summary>
        /// <returns>错误信息</returns>
        public ActionResult GenerateSalary(DateTime date, bool isNew)
        {
            string errmsg = string.Empty;
            GenerateSalaryDelegate method = new GenerateSalaryDelegate(GenerateSalaryMethod);
            IAsyncResult result  = method.BeginInvoke(date, isNew, out errmsg, null, null);
            return Json(new { Result = true });
            ////选中部门生成--遍历所有部门人员再生成
            //try
            //{
            //    var salaryService = new GenerateSalaryService();
            //    salaryService.Clear(date);
            //    salaryService.ClearGold(date);

            //    var empfollows = BLL.EmpFollowBLL.GetEmpFollows(date.AddMonths(-1));
            //    var mamagerParam = new ManagerParam().FindOur(null).First();
            //    //因职务或部门要改变,所以不能用缓存中的人员
            //    var edoc = new BsonDocument().Ne("Name", "部门公共");
            //    var employees = new Employee().FindOur(edoc).ToList();
            //    var ml = employees.FirstOrDefault(emp => emp.Name == "马露");
            //    var i = 0;
            //    var sm = employees.Where(a => a.Name == "苏敏").ToList();
            //    foreach (var emp in employees)
            //    {
            //        //if (emp.Name != "范美兰")
            //        //{
            //        //    continue;
            //        //}
            //        try
            //        {
            //            if (emp.QuitDate != null && Convert.ToDateTime(emp.QuitDate).FirstMontDay().Date >= DateTime.Now.FirstMontDay().Date)
            //            {
            //                DutyDayService.DelAbnormalAndArrange(date.FirstMontDay(), date.LastMonthDay(), emp);
            //            }
            //            salaryService = new GenerateSalaryService(emp.ToPartEmployee());
            //            //if (emp.Name == "苏敏")// || emp.Name == "张云虎" || emp.Name == "江浩")
            //                salaryService.GenerateEmployeeSalary(date, isNew, empfollows, mamagerParam);

            //                i++;
            //        }
            //        catch (Exception ex)
            //        {
            //            string errorMsg = string.Format("错误信息:{0} \r\n 人员ID:{1} \r\n 人员名称:{2}", ex.Message, emp.SId,
            //                emp.Name);
            //            continue;
            //            return Json(new { Result = false, Message = errorMsg });
            //        }

            //    }
            //    return Json(new { Result = true });
            //}
            //catch (Exception)
            //{
            //    return Json(new { Result = false, Message = "系统繁忙,请稍后再试" });
            //}
        }

        public bool GenerateSalaryMethod(DateTime date, bool isNew, out string msg)
        {
            //选中部门生成--遍历所有部门人员再生成
            try
            {
                var salaryService = new GenerateSalaryService();
                salaryService.Clear(date);
                salaryService.ClearGold(date);
                msg = string.Empty;
                var empfollows = BLL.EmpFollowBLL.GetEmpFollows(date.AddMonths(-1));
                var mamagerParam = new ManagerParam().FindOur(null).First();
                //因职务或部门要改变,所以不能用缓存中的人员
                var edoc = new BsonDocument().Ne("Name", "部门公共");
                var employees = new Employee().FindOur(edoc).ToList();
                var ml = employees.FirstOrDefault(emp => emp.Name == "马露");
                var i = 0;
                var sm = employees.Where(a => a.Name == "苏敏").ToList();
                TotalNum = employees.Count;
                foreach (var emp in employees)
                {
                    //if (emp.Name != "范美兰")
                    //{
                    //    continue;
                    //}
                    try
                    {
                        if (emp.QuitDate != null && Convert.ToDateTime(emp.QuitDate).FirstMontDay().Date >= DateTime.Now.FirstMontDay().Date)
                        {
                            DutyDayService.DelAbnormalAndArrange(date.FirstMontDay(), date.LastMonthDay(), emp);
                        }
                        salaryService = new GenerateSalaryService(emp.ToPartEmployee());
                        //if (emp.Name == "苏敏")// || emp.Name == "张云虎" || emp.Name == "江浩")
                        salaryService.GenerateEmployeeSalary(date, isNew, empfollows, mamagerParam);

                        i++;
                        Surplus = i;
                    }
                    catch (Exception ex)
                    {
                        string errorMsg = string.Format("错误信息:{0} \r\n 人员ID:{1} \r\n 人员名称:{2}", ex.Message, emp.SId,
                            emp.Name);
                        continue;
                        msg = errorMsg;
                        return false;
                        //return Json(new { Result = false, Message = errorMsg });
                    }

                }
                return true;
                //return Json(new { Result = true });
            }
            catch (Exception)
            {
                msg = "系统繁忙,请稍后再试";
                return false;

                //return Json(new { Result = false, Message = "系统繁忙,请稍后再试" });
            }
        }

        public delegate bool GenerateSalaryDelegate(DateTime date, bool isNew, out string msg);

        public ActionResult GetTotalNum(string type)
        {
            return Json(new { total = TotalNum, surplus = Surplus });
        }

 纠其原因,是因为Session引起的,在后来的工作中发现,只需要加上Session的会话状态即可解决上诉问题。

[SessionState(SessionStateBehavior.ReadOnly)]

原文地址:http://www.cnblogs.com/kissdodog/archive/2013/02/08/2909292.html

转载于:https://www.cnblogs.com/toloe/p/5511591.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端使用WebSocket可以实现长轮询请求数据。WebSocket是一种在单个 TCP 连接上进行全双工通信的协议。相比于传统的轮询方式,WebSocket具有以下优点: 1. 实时性高:WebSocket建立起长久的连接后,可以实时推送数据,避免了频繁发送请求的开销。 2. 减少网络负载:WebSocket的连接是双向的,可以同时进行数据的发送和接收,不需要每次请求都带上HTTP头。 3. 较低的延迟:WebSocket使用的是单个TCP连接,可以减少网络延迟,提升性能。 相比之下,长轮询请求数据的方式存在一些缺点: 1. 服务端资源消耗较大:长轮询方式中,服务端需要持续hold住客户端的请求,这会导致占用服务器资源。 2. 数据更新频繁时效率低:如果数据更新频繁,每次都需要创建和重建连接,这会带来较大的开销。 因此,前端使用WebSocket可以更好地实现长轮询请求数据的需求,提高实时性和性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [前端和后台进行WebSocket长连接和axios轮询的方法(vue框架)](https://blog.csdn.net/weixin_43216105/article/details/89555480)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [数据实时更新解决方案(长轮询以及WebSocket)](https://blog.csdn.net/qq_43456687/article/details/128133498)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值