Jquery 控制器的动作似乎是同步的,尽管在不同的请求上?

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() {

我认为下面的代码应该异步工作

但是,当我查看firebug时,我看到请求是异步触发的,但结果是同步返回的:

控制器:

[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);
        }
    }
}