Net core API для спа и асинхронных - PullRequest
0 голосов
/ 29 января 2019

Я создаю новый API net core 2.2 для использования с клиентом JavaScript.В некоторых примерах в Microsoft контроллер имеет все асинхронные методы, а в некоторых - нет.Должны ли методы в моем API быть асинхронными.Будет использовать IIS, если это является фактором.Пример метода будет включать вызов другого API и возвращение результата, в то время как другой будет выполнять запрос к базе данных, используя Entity Framework.

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Во-первых, вам нужно понять, что делает async.Проще говоря, он позволяет потоку, обрабатывающему запрос, быть возвращенным в пул для выставления других запросов, если поток переходит в состояние ожидания.Это почти всегда вызывается операциями ввода-вывода, такими как запросы к базе данных, запись / чтение файла и т. Д. Работа с процессором, такая как вычисления, требует активного использования потока и, следовательно, не может обрабатываться асинхронно.Побочным преимуществом async является возможность «отменить» работу.Если клиент преждевременно закрывает соединение, это вызовет токен отмены, который может использоваться поддерживаемыми асинхронными методами для отмены незавершенной работы.Например, если вы передали токен отмены в вызов чего-то вроде ToListAsync(), а клиент закрыл соединение, EF увидит это и впоследствии отменит запрос.Это на самом деле немного сложнее, чем это, но вы поняли.

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

Тем не менее, несмотря на то, что асинхронность требует незначительных затрат на производительность, она обычно незначительна, а преимущества, которые она дает с точки зрения масштабируемости, обычно стоят компромисса.,Таким образом, в большинстве случаев предпочтительнее использовать асинхронный режим.Кроме того, если вы делаете что-то асинхронное, то ваше действие также должно быть асинхронным.Например, все, что делает EF Core, является асинхронным.Методы синхронизации (ToList вместо ToListAsync) просто блокируют асинхронные методы.Поэтому, если вы делаете запрос через EF, используйте async.Методы синхронизации предназначены только для поддержки определенных ограниченных сценариев, в которых нет другого выбора, кроме как обрабатывать синхронизацию, и в таких случаях вы должны запускаться в отдельном потоке (Task.Run), чтобы предотвратить взаимные блокировки.

ОБНОВЛЕНИЕ

Я должен также упомянуть, что с действиями, особенно с обработчиками Razor Page, все немного мутно.Существует целый конвейер запросов, частью которого является действие / обработчик.Наличие действия «sync» не препятствует выполнению какой-либо асинхронной операции в вашем представлении или в каком-либо обработчике политики, компоненте представления и т. Д. Само действие должно быть асинхронным, только если оно само выполняет какую-то асинхронную работу.

Обработчики Razor Page, в частности, часто будут синхронизированы, потому что в самом обработчике обычно происходит очень мало обработки;все это в подчиненных процессах.

0 голосов
/ 30 января 2019

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

Зачем использовать Async

Даже если ваш контроллер API использует одну операцию (скажем, выборку из БД)Вы должны использовать Async.Причина в том, что ваш сервер имеет ограниченное количество потоков для обработки клиентских запросов.Предположим, что ваше приложение может обработать 20 запросов, и если вы не используете Async, вы блокируете поток обработчика для выполнения операции (операция с БД), которая может быть выполнена другим потоком (Async).В свою очередь, ваша очередь запросов увеличивается, потому что ваш основной поток занят другими делами и не может следить за новыми запросами, на каком-то этапе ваше приложение перестанет отвечать.Если вы используете Async, основной поток может обрабатывать больше клиентских запросов, в то время как другие операции выполняются в фоновом режиме.

Дополнительные ресурсы

Я бы определенно рекомендовал смотреть очень информативноофициальное видео от Microsoft по вопросам производительности.https://www.youtube.com/watch?v=_5T4sZHbfoQ

0 голосов
/ 29 января 2019

Лучше всего использовать async для методов вашего контроллера, особенно если ваши сервисы делают что-то вроде доступа к базе данных.Независимо от того, являются ли методы вашего контроллера асинхронными или нет, для IIS не имеет значения, ядро ​​.net будет вызывать их.Оба будут работать, но вы всегда должны стараться использовать async, когда это возможно.

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