起因:因项目需要监控方法中计算进度,故而想通过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. jQuery easyui datagrid数据绑定

    1.绑定json数据 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&qu ...

  2. axure复用-自定义组件,母版(模板)

    组件(控件)是用于设计线框图的用户界面元素.在组件(控件)面板中包含有常用的控件库,如按钮.图片.文本框等.从组件面板中拖动一个控件到线框图区域中,就可以添加一个组件.组件可以从一个线框图中被拷贝(C ...

  3. shell脚本实例-菜单样例

    1.9.1 实例需求 用户在进行Linux系统管理的过程中,经常需要用到查看进程的信息.用户的信息等常用的功能.本例针对这一需求,使用shell编程实现基本的系统管理 功能.通过本程序,可以按照要求实 ...

  4. openjudge-回文串判断【递归】

    回文串判断 总时间限制: 1000ms 内存限制: 65536kB 描述 任意给定一个非空的字符串,判断其是否是回文串.回文串是指正向看和反向看均相等的串,如AbcDcbA和cDDc.如果是回文串,则 ...

  5. windows中用eclipse开发Android环境搭建SDK安装异常

    SDK更新时的“https://dl-ssl.google.com refused”错误 Download interrupted: hostname in certificate didn't ma ...

  6. Readonly和Disabled的区别

    readonly 把输入的字段设为只读,但是没有禁用 readonly=” readonly”; disabled 禁用一个input元素. disabled="disabled" ...

  7. Redis 实现高效不遗漏的事件封装

    虽然Redis有订阅功能,但是订阅功能是实时的,过了这个点,就接收不到消息了. 同时,如果订阅的客户端因为某些特殊原因shutdown了,那也就找不回未处理完整的订阅事件了. 但好在,Redis还有一 ...

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

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

  9. Java与.NET兼容的RSA密钥持久化方法

    默认情况下,.NET生成的RSA密钥对可以用XML或字节流来保存,而JAVA中生成的RSA密钥对只能用字节流来保存.而它们的字节流格式不同,就导致Java中生成的RSA密钥对不能在.NET中使用,而. ...

  10. VS2010打开项目时,出现“已经在解决方案中打开了具有该名称的项目”问题的解决方案

    用的是VSS代码管理.一打开解决方案就看到有个类库不能加载. 解决方法: 直接右键编辑无法加载的类库,或者记事本编辑有问题类库的csproj文件, 删除以下几行: <SccProjectName ...