【问题标题】:Why is controller thread is blocked if I use the session?如果我使用会话,为什么控制器线程被阻塞?
【发布时间】:2013-04-19 06:50:47
【问题描述】:

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

  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 的这种行为?

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-3 controller asynccontroller


    【解决方案1】:

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

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

    阅读此处了解更多信息:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-22
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 1970-01-01
        • 2021-08-29
        • 1970-01-01
        相关资源
        最近更新 更多