【发布时间】:2014-12-04 19:12:26
【问题描述】:
我有一个页面,其中包含每 5 秒触发一次的 AJAX 轮询请求以及可能需要一分钟才能完成的其他 AJAX CRUD 操作。似乎正在发生的是轮询请求每 5 秒执行一次并完成一次,除非正在处理长时间运行的请求 - 在这些长时间运行的执行场景中,轮询请求的 beforeSend 事件将触发,但不会命中控制器,直到长时间运行的请求完成。轮询请求只是排队等待,直到长时间运行的请求完成,此时它将执行排队的轮询请求。
我使用测试方法和 30 秒的线程休眠在我现有的解决方案(结果如下)中重新创建了场景,以模拟长时间运行的数据库事务。您会注意到,当TestSlowMethod30Seconds() 开始时,TestRequest() 调用开始排队,只有在TestSlowMethod30Seconds() 完成后,TestRequest() 调用才完成。
如果我使用基本的 MVC VS 模板创建一个全新的解决方案并执行相同的操作,它会按预期工作并且长时间运行的请求不会影响其他请求 - 它们都是完全异步处理的。
我花了一整天的时间进行此测试,但我终其一生都无法弄清楚我现有解决方案的问题所在。
有人有什么想法吗?
var ajaxTest = namespace("test.ajaxTest");
ajaxTest.init = function () {
window.setInterval(function () {
ajaxTest.TestRequest();
}, 5000);
};
ajaxTest.TestRequest = function () {
$.ajax({
type: "POST",
url: "/Test/TestRequest",
beforeSend: function () {
console.log("*** TestRequest() begin");
},
complete: function () {
console.log("*** TestRequest() complete");
}
});
};
// this method is called from a button click event
ajaxTest.TestSlowMethod30Seconds = function () {
$.ajax({
type: "POST",
url: "/Test/TestSlowMethod30Seconds",
beforeSend: function () {
console.log("*** TestSlowMethod30Seconds() begin");
},
complete: function () {
console.log("*** TestSlowMethod30Seconds() complete");
}
});
};
MVC 测试控制器
public ActionResult TestRequest()
{
return Json("Success");
}
public ActionResult TestSlowMethod30Seconds()
{
System.Threading.Thread.Sleep(30000);
return Json("Success");
}
【问题讨论】:
标签: c# ajax asp.net-mvc