我认为以下代码应该异步工作。
但是,当我查看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);
}
}
}
附加信息:
任何人都能解释一下吗? Status
行动是否应该立即返回,而不是等待CreateSite
完成?
编辑:
如何让长时间运行的流程启动并仍然获得状态更新?
答案 0 :(得分:2)
Web服务器一次只能从每个用户运行一个请求。请求根据会话ID排队。
(这使得构建Web应用程序变得更加容易,因为您不必考虑两个线程同时访问同一用户的数据的可能性。)