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, вы увидите, что действия можно вызвать, не дожидаясь друг друга. Однако, как только вы используете объект сеанса, вы не увидите результат второго действия до завершения первого. Может ли кто-нибудь объяснить это поведение asp.net mvc?

ответ

2

Это вызвано блокировкой сеанса. По сути, каждый запрос, который использует состояние сеанса, помещает на него блокировку до тех пор, пока это не будет выполнено. Последующие запросы не могут доступа Session до тех пор, пока предыдущий запрос не освободит блокировку.

Целью этого является обеспечение целостности данных сеанса. Например, что произойдет, если запрос A, необходимый для записи на сеанс, и запрос B необходимо прочитать, но запросы были выпущены одновременно? Данные, которые читает B, непредсказуемы, так как вы не можете узнать, будет ли это до или после записи.

Читайте здесь для получения дополнительной информации:

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

0

Вы можете использовать асинхронные контроллеры для различного поведения. См. Это link