.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服务都是客户端发出请求,服务端给出响应.但是现在直观的要求是允许特定时间内在没有客户端发起请求的情况下服务端主动推 ...
随机推荐
- Python面向对象编程——引言
1.类和实例:类是对象的定义,而实例是真正的事物.他存放了类中所定义的对象的具体信息 关键字是class,后面紧跟着一个类名,随后是定义类的雷替代码.通常有各种各样的定义和声明组成. class ...
- div+css关于overflow 动态滚动效果
http://www.ablanxue.com/prone_2613_1.html 关于overflow:hidden不起作用的说明
- 怎么用EDIUS实现跟踪马赛克效果
我们经常会在一些新闻的视频中看到一些马赛克,这些马赛克一般都是保护人物的隐私权,肖像权什么的.我们时常也会看到即使人物位置发生了变化,被遮挡的地方依旧还是被遮挡住,一点也不用担心因为人物运动而使马赛克 ...
- 一个LINUX狂人的语录(个人认为很精辟)
http://blog.chinaunix.net/uid-57160-id-2734431.html?page=2 我已经半年没有使用 Windows 的方式工作了.Linux 高效的完成了我所有的 ...
- Linux How to add a new disk to LVM
转自:http://blog.itpub.net/7191998/viewspace-772060/ 1.check old diskspace and device listdf -halfree ...
- python3倒叙字符串
google测试工程师的一道题: 设计一个函数,使用任意语言,完成以下功能: 一个句子,将句子中的单词全部倒排过来,但单词的字母顺序不变.比如,This is a real world,输出结果为 w ...
- winrar 5.21去广告
http://www.rarlab.com/ 把下面的数据复制到“记事本”中,用文件名“rarreg.key搜索”命名该文件,保存到winrar安装文件夹即完成注册 RAR registration ...
- maven NoClassDefFoundError: org/mortbay/util/Attributes
在运行mvn jetty:run报错: NoClassDefFoundError: org/mortbay/util/Attributes 解决方法: deleted /home/jenkins/.m ...
- Intellij IDEA 的使用(创建项目、导入项目、同时部署多个项目、JRebel)等常见eclipse、myeclipse换idea必看
第一篇:Intellij IDEA 的使用 1.黑色主题 中文乱码修改 2.WEB项目的部署 以及自动编译 3.多项目的同时部署 4.相关插件提高工作效率 1.JRebel插件 实现热部署 2.Tas ...
- asp.net 计算两个时间差
两个时间相差多少 .net中的timespan应用2008/11/10 11:54TimeSpan 对象表示时间间隔或持续时间,按正负天数.小时数.分钟数.秒数以及秒的小数部分进行度量.用于度量持续时 ...