.NET 请求被挂起,前端轮询,委托
起因:因项目需要监控方法中计算进度,故而想通过AJAX调用,返回前端显示进度,结果开发中遇到第二个AJAX请求被挂起,需要等到第一个请求(计算)完成后,才会被处理到。
百度种种,知其原因是在Session上,但因项目过大,不敢随意删除Session。故而只能将后台计算方法放入线程,用委托的方式异步调用该计算方法,前端进行AJAX轮询,实时
检查计算进度。
轮询:setInterval 关闭clearInterval
委托Delegate的BeginInvoke是用于异步执行方法,Invoke是同步执行方法,EndInvoke会阻塞线程,直到方法执行完毕。
<script type="text/javascript">
var si;
function GenerateSalary() {
$("#btnGenerateSalary").attr("disabled", "disabled");
$("#btnGenerateSalary").text("生成中..");
$("#btnGenerateSalary").hide();
//$("#btnSeeProceess").show();
$("#LoadingBg").show();
$("#salaryLab").show();
$.post("/AbnormalRoll/GenerateSalary", "date=" + $("#SalaryYear").val() + "-" + $("#SalaryMonth").val() + "&isNew=" + $("#chkIsNew").prop("checked"), function (d) {
si=setInterval(GetTotalNum, 1000);
});
} function GetTotalNum() {
$.post("/AbnormalRoll/GetTotalNum", "type=1", function (d) {
$("#totalNum").val(d.total);
$("#surplusNum").val(d.surplus);
if (d.total == d.surplus) {
clearInterval(si);
$("#LoadingBg").hide();
$("#salaryLab").hide();
$("#btnGenerateSalary").show();
$("#btnGenerateSalary").text("生成工资");
$("#btnGenerateSalary").removeAttr("disabled");
}
});
}
</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(-));
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 = ;
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
.NET 请求被挂起,前端轮询,委托的更多相关文章
- 【轮询】【ajax】【js】【spring boot】ajax超时请求:前端轮询处理超时请求解决方案 + spring boot服务设置接口超时时间的设置
场景描述: ajax设置timeout在本机测试有效,但是在生产环境等外网环境无效的问题 1.ajax的timeout属性设置 前端请求超时事件[网络连接不稳定时候,就无效了] var data = ...
- 前端 - 轮询, 长轮训, websocket
轮询 概念 ajax 轮询的原理很简单,让浏览器间隔几秒就发送一次请求,询问服务器是否有新信息 代码 function showUnreadNews() { $(document).ready(fun ...
- 用.NET MVC实现长轮询,与jQuery.AJAX即时双向通信
两周前用长轮询做了一个Chat,并移植到了Azure,还写了篇博客http://www.cnblogs.com/indream/p/3187540.html,让大家帮忙测试. 首先感谢300位注册用户 ...
- 轮询、长轮询、websock
引入 Web端即时通讯技术:即时通讯技术简单的说就是实现这样一种功能:服务器端可以即时地将数据的更新或变化反应到客户端,例如消息即时推送等功能都是通过这种技术实现的.但是在Web中,由于浏览器的限制, ...
- http长短连接和长短轮询
http长连接 http长连接是指http的请求头和响应头的均有connection: keep-alive的请求,也就是客户端和服务端均为keep-alive的请求. 实际上,http是请求/响应式 ...
- 使用轮询&长轮询实现网页聊天室
前言 如果有一个需求,让你构建一个网络的聊天室,你会怎么解决? 首先,对于HTTP请求来说,Server端总是处于被动的一方,即只能由Browser发送请求,Server才能够被动回应. 也就是说,如 ...
- 网页实时聊天之js和jQuery实现ajax长轮询
众所周知,HTTP协议是无状态的,所以一次的请求都是一个单独的事件,和前后都没有联系.所以我们在解决网页实时聊天时就遇到一个问题,如何保证与服务器的长时间联系,从而源源不段地获取信息. 一直以来的方式 ...
- gevent中如何实现长轮询
浏览网页时,浏览器会传HTTP 请求到服务器,服务器会根据请求将网页的内容传给浏览器,但是在很多的情况下,使用者会需要看到最新的即时性资讯,例如观看股票市场行情,而在以前只能靠着重新载入网页才能获得最 ...
- 实现web消息推送的技术和采用长轮询corundumstudio介绍
实时消息的推送,PC端的推送技术可以使用socket建立一个长连接来实现.传统的web服务都是客户端发出请求,服务端给出响应.但是现在直观的要求是允许特定时间内在没有客户端发起请求的情况下服务端主动推 ...
随机推荐
- sql server 创建文件组,文件
添加文件组: --ADD FILEGROUP 增加文件组 ALTER DATABASE TestHekaton ADD FILEGROUP [Report] ALTER DATABASE TestH ...
- web.xml中load-on-startup标签的含义
在servlet的配置当中,<load-on-startup>5</load-on-startup>的含义是: 标记容器是否在启动的时候就加载这个servlet. 当值为0或者 ...
- svg中改变class调用的线条颜色
<style type="text/css"><![CDATA[ .kV220 {stroke:rgb(255,0,0);fill:none} .kV22 {st ...
- linux小包集合
mingetty包 getty是Unix类操作系统启动时必须的三个步骤之一,用来开启终端,进行终端的初始化.目前一般常用的getty程序有如下几种:1.agetty(有时直接称为getty):容易设置 ...
- 虚拟化之esxi命令行管理
Vmware PowerCLI和Vmware CLI vMA A Linux virtual appliance that includes the vSphere SDK for Perl and ...
- OpenJudge计算概论-寻找下标
/*======================================================================== 寻找下标 总时间限制: 1000ms 内存限制: ...
- CentOS6.4系统启动失败故障排查
转:http://www.centoscn.com/CentosBug/osbug/2014/1028/4011.html 操作系统启动失败如下图报错: 故障现象: 从图中可以看到,操作系统启动的过程 ...
- yii 获取当前ip 常用的调用变量
echo Yii::app()->request->hostInfo; //除域名外的URL echo Yii::app()->request->getUrl(); //除域名 ...
- 转载: scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法
版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] ================== ...
- MySQL explain key_len 大小的计算
总结: 变长字段需要额外的2个字节,固定长度字段不需要额外的字节.而null都需要1个字节的额外空间,所以以前有个说法:索引字段最好不要为NULL,因为NULL让统计更加复杂,并且需要额外一个字节的存 ...