Во-первых, вам нужно понять, что делает async.Проще говоря, он позволяет потоку, обрабатывающему запрос, быть возвращенным в пул для выставления других запросов, если поток переходит в состояние ожидания.Это почти всегда вызывается операциями ввода-вывода, такими как запросы к базе данных, запись / чтение файла и т. Д. Работа с процессором, такая как вычисления, требует активного использования потока и, следовательно, не может обрабатываться асинхронно.Побочным преимуществом async является возможность «отменить» работу.Если клиент преждевременно закрывает соединение, это вызовет токен отмены, который может использоваться поддерживаемыми асинхронными методами для отмены незавершенной работы.Например, если вы передали токен отмены в вызов чего-то вроде ToListAsync()
, а клиент закрыл соединение, EF увидит это и впоследствии отменит запрос.Это на самом деле немного сложнее, чем это, но вы поняли.
Следовательно, вам нужно просто оценить, выгодна ли асинхронность в конкретном сценарии.Если вы собираетесь выполнять ввод-вывод и / или хотите отменить текущую работу, то сделайте асинхронный.В противном случае вы можете придерживаться синхронизации, если хотите.
Тем не менее, несмотря на то, что асинхронность требует незначительных затрат на производительность, она обычно незначительна, а преимущества, которые она дает с точки зрения масштабируемости, обычно стоят компромисса.,Таким образом, в большинстве случаев предпочтительнее использовать асинхронный режим.Кроме того, если вы делаете что-то асинхронное, то ваше действие также должно быть асинхронным.Например, все, что делает EF Core, является асинхронным.Методы синхронизации (ToList
вместо ToListAsync
) просто блокируют асинхронные методы.Поэтому, если вы делаете запрос через EF, используйте async.Методы синхронизации предназначены только для поддержки определенных ограниченных сценариев, в которых нет другого выбора, кроме как обрабатывать синхронизацию, и в таких случаях вы должны запускаться в отдельном потоке (Task.Run
), чтобы предотвратить взаимные блокировки.
ОБНОВЛЕНИЕ
Я должен также упомянуть, что с действиями, особенно с обработчиками Razor Page, все немного мутно.Существует целый конвейер запросов, частью которого является действие / обработчик.Наличие действия «sync» не препятствует выполнению какой-либо асинхронной операции в вашем представлении или в каком-либо обработчике политики, компоненте представления и т. Д. Само действие должно быть асинхронным, только если оно само выполняет какую-то асинхронную работу.
Обработчики Razor Page, в частности, часто будут синхронизированы, потому что в самом обработчике обычно происходит очень мало обработки;все это в подчиненных процессах.