Могу ли я использовать асинхронный контроллер здесь?(ASP.NET MVC 3) - PullRequest
5 голосов
/ 19 января 2011

У меня есть [HttpPost] метод действия:

[HttpPost]
public ActionResult AddReview(Review review)
{
   repository.Add(review);
   repository.Save();
   repository.UpdateSystemScoring(review.Id); // call SPROC with new Review ID.
   return View("Success", review);
}

Итак, в основном пользователь нажимает кнопку, я добавляю ее в свою базу данных (через Entity Framework 4.0), сохраняю изменения и затем вызываюхранимая процедура с полем идентификации, которое является второй последней строкой кода.

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

С точки зрения пользователя , он / она не /не должно волновать, что этот расчет происходит.

Эта процедура может занять от 0 до 20 секунд.Он ничего не возвращает.

Это кандидат на асинхронный контроллер?

Есть ли способ добавить обзор и разрешить другому асинхронному контроллеру обрабатывать длительный вызов SPROC, чтобы пользователь мог сразу перейти на страницу успеха?

Я должен признать, (частично стыдно за это): это переписывание существующей системы, и в исходной системе (ASP.NET Web Forms) я запустил другой поток для достиженияВышеприведенная задача - вот почему мне было интересно, можно ли применить тот же принципал к ASP.NET MVC 3.

Я всегда пытаюсь и избегать многопоточности в ASP.NET, но пользовательопыт является приоритетом № 1, и я не хочу, чтобы время ожидания страницы истекло.

Итак, возможно ли это?Также рады услышать любые другие идеи.Кроме того - я не могу использовать триггеры здесь, на самом деле не хочу вдаваться в подробности почему - но я не могу.

Ответы [ 4 ]

4 голосов
/ 19 января 2011

Я бы запустил новый поток (не из пула потоков) для выполнения этой задачи и немедленно вернулся бы, особенно если вас не интересуют результаты.Асинхронные контроллеры полезны в ситуациях, когда большая часть времени тратится на ожидание какой-либо другой системы, чтобы завершить задачу, и вы, как только эта система завершает задачу, сигнализируется вашему приложению для обработки результата.Во время выполнения задачи из вашего приложения не расходуются потоки.Таким образом, в вашем сценарии эта задача может быть выполнена SQL Server с использованием асинхронных версий методов BeginRead в ADO.NET.Вы можете использовать это, если вам нужны результаты обратно.Если вы не запустите новую нить, все будет работать нормально, как и раньше.

1 голос
/ 19 января 2011

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

Action -> causes javascript request to web server
   |
Web server puts notification on queue
   |
Worker picks up message from queue and does point calculation
   |
At some point in future user sees points adjusted

Это позволяет нам справляться с большими объемами пользовательской нагрузки, и нам не нужно беспокоиться о том, что это отрицательно скажется на нашей вычислительной системе. Это также означает, что мы можем добавить больше рабочих, чтобы справляться с большей нагрузкой, когда у нас большая нагрузка, и можем удалять рабочих, когда у нас нет большой нагрузки.

1 голос
/ 19 января 2011

Я думаю, что асинхронные контроллеры - это больше для вещей, где запрос может занять много времени, чтобы вернуть ответ, но основной поток будет тратить большую часть этого времени в ожидании другого потока / процесса.Это в основном полезно для вызовов ajax, а не для загрузки главной страницы, когда допустимо просто показывать индикатор выполнения до тех пор, пока ответ не будет возвращен.

Я использую отдельную систему очередей для этого типа задачи, которая болееНадежный и простой в работе, но для его настройки требуется немного больше работы.Если вам действительно нужно сделать это в рамках процесса ASP.net, лучше всего подойдет отдельный запрос, хотя есть вероятность того, что задача не будет выполнена - например, я не уверен, что произойдет, если соединение обрывается илиПул приложений перезагружается во время выполнения асинхронной задачи.

1 голос
/ 19 января 2011

Поскольку запуск системы оценки занимает так много времени, я бы рекомендовал использовать запланированное задание в SQL Server или Windows для обновления результатов каждые x минут. Поскольку пользователь не знает о запросе, запускать не имеет значения.

Вы можете добавить идентификаторы в очередь и обрабатывать очередь каждые 30 минут.

В противном случае, если есть причина, по которой этот запуск должен быть выполнен немедленно, вы можете сделать асинхронный вызов или посмотреть, сможете ли вы обрезать жир из сохраненного процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...