Подтвердить что ты не робот

Методы асинхронного действия

Я смотрел шаблоны ASP.NET MVC 5, и я заметил, что многие из этих действий и помечены как async:

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) { }

Когда я должен делать это при действии MVC? Когда он содержит доступ к базе данных?

Если я вызову репозиторий внутри действия, я также должен использовать Task, чтобы сделать его async?

4b9b3361

Ответ 1

Ядро ваших вопросов: когда я должен делать свои действия MVC async? См. http://blogs.msdn.com/b/rickandy/archive/2009/11/14/should-my-database-calls-be-asynchronous.aspx для хорошего обсуждения проблемы. Он говорит только о базе данных, но его пункты переносятся.

По существу, почти никогда не вызывайте базу данных асинхронным способом.

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

Не отвлекайте людей, говорящих вам всегда использовать async IO, если это возможно. Асинк - это все ярость прямо сейчас. Распространено множество иррациональных советов.

Ответ 2

Entity Framework 6 (используется по умолчанию с MVC 5) теперь поддерживает вызовы асинхронной базы данных, поэтому сигнатуры метода действия были обновлены, чтобы отражать используемую асинхронную связь. Простой ответ заключается в том, что всякий раз, когда у вас есть задача, потенциально связанная с ожиданием, используйте async. Надеемся, что ваши запросы к базе данных не займут достаточно времени, чтобы совершить кругосветку, чтобы на самом деле выиграть от асинхронного использования, но если ваша база данных падает или сильно забивается, она, по крайней мере, поможет не блокировать IIS в этом процессе.

Ответ 3

Здесь статья, в которой перечислены некоторые случаи использования при использовании задач, может принести пользу, а некоторые используют случаев, когда может иметь обратный эффект. Ответ не такой простой каждый раз, вот почему последний пункт тестирования.

Цитата из http://www.asp.net/mvc/overview/performance/using-asynchronous-methods-in-aspnet-mvc-4

В общем случае используйте синхронные методы для следующих условий:

  • Операции простые или короткие.
  • Простота важнее эффективности.
  • Операции - это главным образом операции ЦП, а не операции, которые связаны с большими дисковыми или сетевыми издержками. Использование асинхронных методы действий при работе с ЦП не обеспечивают никаких преимуществ и приводит к увеличению накладных расходов.

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

  • Вы вызываете службы, которые могут быть использованы через асинхронные методы, и вы используете .NET 4.5 или выше.
  • Операции привязаны к сети или привязаны к I/O вместо привязки к ЦП.
  • Parallelism важнее, чем простота кода.
  • Вы хотите предоставить механизм, который позволяет пользователям отменить длительный запрос.
  • Когда преимущество переключения потоков приводит к снижению стоимости контекстного переключателя. В общем, вы должны сделать метод асинхронным, если синхронный метод ожидает потока запросов ASP.NET во время выполнения нет работы. Сделав вызов асинхронным, поток запросов ASP.NET не останавливается, не делая никакой работы, пока он ждет веб-службы запрос на завершение.
  • Тестирование показывает, что операции блокировки являются узким местом в производительности сайта и что IIS может обслуживать больше запросов, используя асинхронные методы для этих блокирующих вызовов.