起因:因项目需要监控方法中计算进度,故而想通过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 请求被挂起,前端轮询,委托的更多相关文章

  1. 【轮询】【ajax】【js】【spring boot】ajax超时请求:前端轮询处理超时请求解决方案 + spring boot服务设置接口超时时间的设置

    场景描述: ajax设置timeout在本机测试有效,但是在生产环境等外网环境无效的问题 1.ajax的timeout属性设置 前端请求超时事件[网络连接不稳定时候,就无效了] var data = ...

  2. 前端 - 轮询, 长轮训, websocket

    轮询 概念 ajax 轮询的原理很简单,让浏览器间隔几秒就发送一次请求,询问服务器是否有新信息 代码 function showUnreadNews() { $(document).ready(fun ...

  3. 用.NET MVC实现长轮询,与jQuery.AJAX即时双向通信

    两周前用长轮询做了一个Chat,并移植到了Azure,还写了篇博客http://www.cnblogs.com/indream/p/3187540.html,让大家帮忙测试. 首先感谢300位注册用户 ...

  4. 轮询、长轮询、websock

    引入 Web端即时通讯技术:即时通讯技术简单的说就是实现这样一种功能:服务器端可以即时地将数据的更新或变化反应到客户端,例如消息即时推送等功能都是通过这种技术实现的.但是在Web中,由于浏览器的限制, ...

  5. http长短连接和长短轮询

    http长连接 http长连接是指http的请求头和响应头的均有connection: keep-alive的请求,也就是客户端和服务端均为keep-alive的请求. 实际上,http是请求/响应式 ...

  6. 使用轮询&长轮询实现网页聊天室

    前言 如果有一个需求,让你构建一个网络的聊天室,你会怎么解决? 首先,对于HTTP请求来说,Server端总是处于被动的一方,即只能由Browser发送请求,Server才能够被动回应. 也就是说,如 ...

  7. 网页实时聊天之js和jQuery实现ajax长轮询

    众所周知,HTTP协议是无状态的,所以一次的请求都是一个单独的事件,和前后都没有联系.所以我们在解决网页实时聊天时就遇到一个问题,如何保证与服务器的长时间联系,从而源源不段地获取信息. 一直以来的方式 ...

  8. gevent中如何实现长轮询

    浏览网页时,浏览器会传HTTP 请求到服务器,服务器会根据请求将网页的内容传给浏览器,但是在很多的情况下,使用者会需要看到最新的即时性资讯,例如观看股票市场行情,而在以前只能靠着重新载入网页才能获得最 ...

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

    实时消息的推送,PC端的推送技术可以使用socket建立一个长连接来实现.传统的web服务都是客户端发出请求,服务端给出响应.但是现在直观的要求是允许特定时间内在没有客户端发起请求的情况下服务端主动推 ...

随机推荐

  1. Json Null 不输出

    [TestMethod]        public void NodeTest()        {            datanode d = new datanode()           ...

  2. vs2012 Nuget错误:“未能解析此远程名称api.nuget.org”

    今天在使用vs2012的Nuget功能向新建MVC项目中添加bootstrap时出现一个错误:“未能解析此远程名称api.nuget.org”: 网上查阅资料得知:nuget.org使用的godadd ...

  3. Swift技术之如何在iOS 8下使用Swift设计一个自定义的输入法 (主要是NSLayoutConstraint 的使用)

    当前位置: > Swift新手入门 > Swift技术之如何在iOS 8下使用Swift设计一个自定义的输入法 时间:2014-09-10 16:49来源:未知 作者:啊成 举报 点击:5 ...

  4. SQL SERVER 生成建表脚本

    /****** Object: StoredProcedure [dbo].[GET_TableScript_MSSQL] Script Date: 06/15/2012 11:59:00 ***** ...

  5. Oracle 11g R2 常用配置与日志的文件位置

    假设.bash_profile中oracle相关环境变量如下: $ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1 $ORACLE_BASE=/u01/a ...

  6. eclipse解压后启动弹出A Java Runtime Evironment(JRE) or Java Development Kit(JDK)....

    系统环境:win7 64bit JDK:jdk-7u79-windows-x64 Eclipse:eclipse-jee-helios-win32 启动eclipse:弹出A Java Runtime ...

  7. java动态代理(JDK和cglib)

    转:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代 ...

  8. HTML 图像

    通过使用 HTML,可以在文档中显示图像. 实例 插入图像 本例演示如何在网页中显示图像. 从不同的位置插入图片 本例演示如何将其他文件夹或服务器的图片显示到网页中. (可以在本页底端找到更多实例.) ...

  9. css之伪类选择器:before :after(::before ::after)

    一.总结: ::before是在标签内容前面添加内容, ::after是在标签内容后面添加内容 ::before ::after与:before  :after的区别:css3中修订后的伪元素使用:: ...

  10. bzoj1966: [Ahoi2005]VIRUS 病毒检测

    Description 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地.科 ...