Действия контроллера выглядят синхронными, хотя для разных запросов? - PullRequest
3 голосов
/ 13 января 2011

У меня сложилось впечатление, что приведенный ниже код должен работать асинхронно.

Однако, когда я смотрю на 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 Server
  • Работа на виртуальной машине VMWare

Кто-нибудь может объяснить это?Разве действие Status не должно возвращаться практически сразу, вместо того, чтобы ждать завершения CreateSite?


Редактировать:

Как мне запустить длительный процесси все еще получать обновления статуса?

1 Ответ

2 голосов
/ 13 января 2011

Веб-сервер запускает только один запрос от каждого пользователя.Запросы ставятся в очередь на основе идентификатора сеанса.

(Это значительно упрощает создание веб-приложений, поскольку вам не нужно учитывать возможность доступа двух потоков к данным для одного и того же пользователя нав то же время.)

...