虽然在不同的请求上,控制器操作似乎是同步的?

时间:2011-01-13 13:47:12

标签: jquery ajax asp.net-mvc-2 asynchronous long-running-processes

我认为以下代码应该异步工作。

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

Requests are handled synchronously

控制器:

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

的Javascript / jQuery的:

$(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);
        }
    }
}

附加信息:

  • IIS 7.0
  • Windows 2008 R2服务器
  • 在VMWare虚拟机中运行

任何人都能解释一下吗? Status行动是否应该立即返回,而不是等待CreateSite完成?


编辑:

如何让长时间运行的流程启动并仍然获得状态更新?

1 个答案:

答案 0 :(得分:2)

Web服务器一次只能从每个用户运行一个请求。请求根据会话ID排队。

(这使得构建Web应用程序变得更加容易,因为您不必考虑两个线程同时访问同一用户的数据的可能性。)