Асинхронные методы контроллера Asp.Net MVC? - PullRequest
3 голосов
/ 15 июля 2011

Я создам веб-страницу Asp.net MVC 3.

Представление : представление (веб-страница) вызывает около пяти вызовов Ajax (jQuery) для методов, которые возвращают JsonResult, в контроллере и отображает результаты на веб-странице.

Control : Методы контроллера считывают базу данных SQL Server 2008 с использованием EF4. Выполнение двух операторов SQL может занять полминуты в зависимости от нагрузки на сервер.

Я бы хотел, чтобы пользователи как минимум могли видеть содержимое, возвращаемое из быстрых вызовов контроллера / базы данных, как можно скорее. На странице не будет много пользователей (может быть, до 15). Будут ли долгосрочные вызовы метода контроллера блокировать другие, если они не асинхронны? Или это не имеет значения, пока пул потоков достаточно велик для обработки пиковых запросов пользователей?

Ответы [ 2 ]

2 голосов
/ 15 июля 2011

С точки зрения пользователя, загрузка начальной веб-страницы происходит синхронно, то есть он должен ждать, пока сервер доставит страницу.Однако запросы Ajax выглядят для него асинхронными, потому что он уже может видеть часть страницы.

С точки зрения сервера, все происходит синхронно.Существует HTTP-запрос, который необходимо обработать, и ответом может быть либо HTML, JSON или любой другой.Клиент будет ждать, пока не получит ответ.И несколько запросов могут обрабатываться параллельно.

Поэтому, если вы не реализуете какую-то специальную блокировку (на веб-сервере или в базе данных), которая блокирует некоторые запросы, ничто не будет заблокировано.

Предложенный подход мне кажется вполне подходящим.

Обновление:

Я забыл одну вещь: ASP.NET содержит механизм блокировки для синхронизации доступа к данным сеансаэто может помешать, если у вас есть несколько одновременных запросов от одного и того же пользователя.Посмотрите на атрибут SessionState, чтобы обойти эту проблему.

Обновление 2:

А также асинхронное поведение с точки зрения пользователя, нет необходимости использовать класс AsyncController.Они были созданы для чего-то другого, что не имеет отношения к вашему случаю, поскольку у них всего 15 пользователей.

1 голос
/ 15 июля 2011

Будут ли долгосрочные вызовы метода контроллера блокировать других, если они не асинхронны?

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

Теперь медленные действия контроллера не будут блокировать действия быстрого контроллера. Неважно, синхронны они или нет. Для длительных действий контроллера может иметь смысл сделать их асинхронными, только если вы используете асинхронные методы ADO.NET для доступа к базе данных и, таким образом, извлекаете выгоду из портов завершения ввода / вывода. Они позволяют вам не использовать потоки во время операций ввода-вывода, таких как доступ к базе данных. Если вы используете стандартные блокирующие вызовы к базе данных, вы не получите никакой выгоды от асинхронных действий.

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

...