起因:因项目需要监控方法中计算进度,故而想通过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. EntityFramework5.0CodeFirst全面学习

    Code First 约定 借助 CodeFirst,可通过使用 C# 或Visual Basic .NET 类来描述模型.模型的基本形状可通过约定来检测.约定是规则集,用于在使用 Code Firs ...

  2. Oracle数据库——体系结构

    一.涉及内容 1.了解数据库的物理存储结构和逻辑存储结构 二.具体操作 1.分别使用SQL 命令和OEM 图形化工具查看本地数据库的物理文件,并使用OEM 工具在现有的users 表空间中添加user ...

  3. 部署 mozilla-BrowserQuest

    1,到GitHub下载代码  https://github.com/mozilla/BrowserQuest 2,安装Node.Js 下载地址 http://nodejs.org/ 直接下载安装版就可 ...

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

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

  5. jquery点击改变class并toggle

    <html> <head> <meta charset="utf-8"> <title></title> <scr ...

  6. 将war文件解压到指定目录

    问:如何将.war文件解压到指定目录? 答:jar命令没有这样的选项. eg:将abc.war解压到当前文件夹? 答:进入目标文件即abc.war文件所在的文件夹,按住shift键并在该文件夹空白处点 ...

  7. Spark(二): 内存管理

    Spark 作为一个以擅长内存计算为优势的计算引擎,内存管理方案是其非常重要的模块: Spark的内存可以大体归为两类:execution和storage,前者包括shuffles.joins.sor ...

  8. IOS开发—数据库的使用

    1.首先封装方法(建一个DataBase类封装) 2.实现DataBase类的方法 3.第一步先建立一个表 4.进行插入.删除.更新 插入的sql语句:@"insert into user ...

  9. UI-UIImageView和Image的区别

    1.UIImageView图片视图控件 继承于UIView 用于显示图片在应用程序中 2.UIImage 是将真实图片文件转化为程序中的图片,然后3.UIImageView是Image的载体,负责显示 ...

  10. php 连接测试sphinx

    shpinx.php <?php header("Content-type:text/html;charset=utf-8"); include 'SphinxClient. ...