1

我有一个非常简单的控制器:

  public class HomeController : Controller
    {
        public ActionResult Index()
        {
            Session["SomeData"] = "123";
            return View();
        }

        [HttpPost]
        public ActionResult LongTest()
        {
            Thread.Sleep(5000);
            return Json(new { Text = DateTime.Now.ToString("hh:mm:ss.fff") + " - LongTest"});
        }

        [HttpPost]
        public ActionResult CantAnswer()
        {
            return Json(new { Text = DateTime.Now.ToString("hh:mm:ss.fff") + " - CantAnswer"});
        }
    }

我以这种方式从客户端使用这些方法:

<script type="text/javascript">
    $(document).ready(function () {
        $('#btnLongOperation').click(function () {
            $.post("/Home/LongTest", null, function (data) {
                $('#result').text(data.Text);
            }, "json");
        });

        $('#btnWnotWork').click(function () {
            $.post("/Home/CantAnswer", null, function (data) {
                $('#result').text(data.Text);
            }, "json");
        });
    });
</script>
<div>
    <input id="btnLongOperation" type="button" value="Long operation"/>
    <input id="btnWnotWork" type="button" value="Won't work"/>
</div>
<div id="result">

如果我单击第一个按钮,然后不等待 5 秒单击第二个按钮,我的第二个操作将不会被调用。如果您在 Init 方法中使用 session 删除字符串,您将看到可以调用这些操作而无需相互等待。但是,一旦您使用会话对象,您将不会看到第二个操作的结果,直到第一个操作完成。谁能解释 asp.net mvc 的这种行为?

4

2 回答 2

2

这是由会话锁定引起的。本质上,每个使用会话状态的请求都会对其进行锁定,直到完成读取。在前一个请求释放锁之前,后续请求无法访问。Session

这样做的目的是确保会话数据的完整性。例如,如果请求 A 需要写入会话,请求 B 需要读取,但请求是同时发出的,会发生什么情况?B 读取的数据是不可预测的,因为您无法知道它是写入前还是写入后。

阅读此处了解更多信息:

http://www.timvasil.com/blog14/post/2008/04/16/Handling-multiple-simultaneous-requests-from-a-user-in-ASPNET.aspx

于 2013-04-25T11:40:23.983 回答
0

您可以将异步控制器用于不同的行为。看到这个链接

于 2013-04-25T11:43:59.683 回答