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
  • Windows2008R2サーバー
  • VMWare仮想マシンで実行

誰かがこれを説明できますか?Statusアクションは、終了するのを待つのではなく、実質的にすぐに戻るべきではありませんCreateSiteか?


編集:

長時間実行されているプロセスを開始し、ステータスの更新を取得するにはどうすればよいですか?

4

1 に答える 1

2

Webサーバーは、各ユーザーから一度に1つの要求のみを実行します。リクエストは、セッションIDに基づいてキューに入れられます。

(これにより、2つのスレッドが同じユーザーのデータに同時にアクセスする可能性を考慮する必要がなくなるため、Webアプリケーションの構築がはるかに簡単になります。)

于 2011-01-13T13:51:08.497 に答える