.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 });
        }
时间: 2024-10-01 05:38:24

.NET 请求被挂起,前端轮询,委托的相关文章

基于轮询实现实时的在线投票系统

需求 用户在投票的页面可以实时的监测到,投票详情 在这里我会通过轮询和长轮询(推荐使用这个,可以减少请求数,实时性也好)的方法来实现 基于轮询实现投票系统 大致的思路是前端开启一个定时器每隔10秒定时的向服务器获取投票的结果 from flask import Flask,render_template,request,jsonify app = Flask(__name__) USERS = { '1':{'name':'贝贝','count':1}, '2':{'name':'小东北','c

轮询,长轮询,websocket原理

服务端朝客户端主动推送消息 轮询:效率低,基本不用 让浏览器定时朝后端发送请求(通过ajax向后端偷偷发送数据),比如每隔五秒钟发一次请求,那么你的数据延迟就可能会高达五秒 不足之处 数据延迟 消耗资源过大 请求次数太多 长轮询:兼容性好,一般大公司都会考虑使用它 # 队列+ajax 服务端给每个客户端建立队列,让浏览器通过ajax朝服务端要数据,去各自的队列中获取 如果没有数据则会阻塞但是不会一直阻塞,比如阻塞你30秒,还没有数据则返回,然后让客户端浏览器再次发送请求数据的请求 相对于轮询 基

gevent中如何实现长轮询

浏览网页时,浏览器会传HTTP 请求到服务器,服务器会根据请求将网页的内容传给浏览器,但是在很多的情况下,使用者会需要看到最新的即时性资讯,例如观看股票市场行情,而在以前只能靠着重新载入网页才能获得最新信息,但是这样不但很浪费时间,也会佔用很多不必要的网络资源,并不是一个好的方式,长轮询就是解决这个问题的一个办法. 什么是长轮询? 1.长时间轮询(long-polling)是让服务器在接收到浏览器发出的HTTP 请求后,服务器会等待一段时间,若在这段时间里面伺服器有新的数据更新,它就会把最新的数

实现web消息推送的技术和采用长轮询corundumstudio介绍

实时消息的推送,PC端的推送技术可以使用socket建立一个长连接来实现.传统的web服务都是客户端发出请求,服务端给出响应.但是现在直观的要求是允许特定时间内在没有客户端发起请求的情况下服务端主动推送消息到客户端. 有哪些可以实现web消息推送的技术: 不断地轮询(俗称“拉”,polling)是获取实时消息的一个手段:Ajax 隔一段时间(通常使用 JavaScript 的 setTimeout 函数)就去服务器查询是否有改变,从而进行增量式的更新.但是间隔多长时间去查询成了问题,因为性能和即

js调用轮询接口

项目中遇到需要很多个需要轮询处理的接口,然后简单的封装了下,做个记录,以后用到类似的直接copy // polling-utils.js /** * @descripting 轮询功能 * @param {String} type 请求类型 * @param {String} url 地址 * @param {Object} data 请求数据 * @param {Number} delay 轮询间隔时间 */ export default function polling(type, url,

Ajax实现的长轮询不阻塞同一时间内页面的其他Ajax请求(同域请求)

最近要做一个来电的弹屏功能,利用OM 系统的接口,OM系统发送请求到接口程序,分析数据添加到mysql数据库中,然后把最新的数据id 跟今日来电的总的数量存储到memcache 中.弹屏程序根据读取的memcache 中的数据  比对,比较是不是有新的请求到来.中间遇到问题是:前台在轮询等待数据的时候,页面中的其他请求被阻塞,查了好多资料,包括 apache 的mpm 模式,都没有找到原因.后来 在论坛里边查到原因:如下 实际上是不能并发访问同一个站点使用了session的页面,因为访问A页面时

javascript轮询请求服务器

抛出问题:web浏览器如何与服务保持通信? 方法一:Ajax轮询 方法二:EventSource轮询 方法三:websocket保持长连接 下面的解决方案是,Ajax轮询与EventSource轮询的合体. 客户端代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> &

ajax轮询请求实现源码分享

ajax轮询请求状态是ajax学习中非常重要的也是必须掌握的知识点,今天就和大家一起来分享一下这部分内容,一起来看看吧.      这里要实现的功能是:通过扫码微信公众号带参数的二维码,来登录网站.      但很明显,如果ajax不间断的请求服务器,这样会加重服务器的负荷,所以本例采用的是js的setInterval来周期性调用执行一个ajax函数来来向服务器请求数据,但请求成功或者请求一定次数后还未成功时用clearinterval函数清空计时器. 代码和注释如下:(后端采用thinkPHP

轮询、长轮询与Web Socket的前端实现页面数据实时

Web Socket 应用场景:实现即时通讯:如股票交易行情分析.聊天室.在线游戏等,替代轮询和长轮询 1.轮询 轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客户端的浏览器.这种传统的HTTP request 的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求,然而HTTP request 的header是非常长的,里面包含的有用数据可能只是一个很小的值,这样会占用很多的带宽. var xhr = new XMLHtt