IHttpActionResult vs async Задача <IHttpActionResult>

Большинство методов Web API 2.0 я видел return IHttpActionResult, который определяется как интерфейс, который "определяет команду, которая асинхронно создает System.Net.Http.HttpResponseMessage".

Я немного смущен тем, что происходит, когда метод возвращает async Task<IHttpActionResult>.

Почему вы используете один над другим? Или они функционально идентичны - не IHttpActionResult уже асинхронны?

Ответ 1

Разница между использованием IHttpActionResult и async Task<IHttpActionResult> заключается в том, использует ли какой-либо из вашего кода функции async и await. Многие библиотеки, такие как Entity Framework, предоставляют версии методов async (например, SaveChangesAsync), которые обеспечивают небольшое увеличение производительности. Однако есть проблемы с использованием async с веб-API, поэтому, если вы не понимаете многие особенности, разумно придерживаться синхронного API.

У Стивена Клири есть много информации о его блоге об особенностях async и await. Для начала я советую посмотреть Не блокировать асинхронный код.

Ответ 2

Ваше действие может вернуть IHttpActionResult, который выполняет асинхронное действие, когда инфраструктура вызывает его ExecuteAsync.

Но если вы должны сначала сделать другие асинхронные вызовы перед созданием и возвратом результата, вам придется изменить подпись на async Task<IHttpActionResult>. Это все, что есть.

Если ваш код действия контроллера не использует await, вы можете вернуться к более простой подписи. Однако результат, который вы вернете, будет по-прежнему асинхронным.

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

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

Соблюдайте осторожность перед вызовом Wait или Result в задаче или созданием задачи самостоятельно в коде ASP.NET.

Две законные причины для ручного кода, преднамеренной многопоточности или parallelism для кода веб-сервера:

  • когда он получает минимальный трафик, но выполняет вычислительную работу, вызов так часто, чтобы выполнить вычисление по данным, и вы хотите использовать все 16 ядер.
  • при выполнении > 1 одновременных звонков в осколки базы данных или > 1 других сервисов, вы должны выполнить задачу для каждого запроса осколка впереди и ждать их всех.