Jquery 控制器的动作似乎是同步的,尽管在不同的请求上?
我认为下面的代码应该异步工作 但是,当我查看firebug时,我看到请求是异步触发的,但结果是同步返回的: 控制器:Jquery 控制器的动作似乎是同步的,尽管在不同的请求上?,jquery,ajax,asp.net-mvc-2,asynchronous,long-running-processes,Jquery,Ajax,Asp.net Mvc 2,Asynchronous,Long Running Processes,我认为下面的代码应该异步工作 但是,当我查看firebug时,我看到请求是异步触发的,但结果是同步返回的: 控制器: [HandleError] public class HomeController : Controller { public ActionResult Status() { return Content(Session["status"].ToString()); } public ActionResult CreateSite() {
[HandleError]
public class HomeController : Controller
{
public ActionResult Status()
{
return Content(Session["status"].ToString());
}
public ActionResult CreateSite()
{
Session["status"] += "Starting new site creation";
Thread.Sleep(20000); // Simulate long running task
Session["status"] += "<br />New site creation complete";
return Content(string.Empty);
}
}
附加信息:
- IIS 7.0
- Windows 2008 R2服务器
- 在VMWare虚拟机中运行
状态
操作是否应该立即返回,而不是等待CreateSite
完成
编辑:
如何启动长时间运行的进程并仍然获得状态更新?web服务器一次只运行来自每个用户的一个请求。请求根据会话id排队
(这使得构建Web应用程序变得更容易,因为您不必考虑两个线程同时访问同一用户的数据的可能性)。在长时间运行的任务继续运行时,我如何获取异步进度状态?@Oded:您创建了一个无会话的页面,可以在另一个请求运行时请求该页面。@Oded:是的,由于该页面是无会话的,您自然不能使用会话在线程之间进行通信。您必须使用其他一些方法,例如状态对象的静态字典。您必须为长时间运行的线程选择一个标识符,例如它的会话id,然后在获取状态时将该id发送到查询字符串中,以便找到正确的状态对象。
$(document).ready(function () {
$.ajax({
url: '/home/CreateSite',
async: true,
success: function () {
mynamespace.done = true;
}
});
setTimeout(mynamespace.getStatus, 2000);
});
var mynamespace = {
counter: 0,
done: false,
getStatus: function () {
$('#console').append('.');
if (mynamespace.counter == 4) {
mynamespace.counter = 0;
$.ajax({
url: '/home/Status',
success: function (data) {
$('#console').html(data);
}
});
}
if (!mynamespace.done) {
mynamespace.counter++;
setTimeout(mynamespace.getStatus, 500);
}
}
}