3

我的印象是下面的代码应该异步工作。

但是,当我查看 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);
  }
}

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
  • 视窗 2008 R2 服务器
  • 在 VMWare 虚拟机中运行

谁能解释一下?动作不应该Status立即返回而不是等待CreateSite完成吗?


编辑:

我怎样才能让长期运行的过程开始并仍然获得状态更新?

4

1 回答 1

2

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

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

于 2011-01-13T13:51:08.497 回答