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

Почему учебник EF 6 использует асинхронные вызовы?

Последнее учебное пособие по EF, в котором описано, как использовать EF 6 с MVC 5, похоже, склоняется к использованию вызовов asych в базе данных, таких как:

Department department = await db.Departments.FindAsync(id);

Является ли это новым стандартом/лучшей практикой?

Я не уверен, какая польза для этого стиля разработки с ASP.NET MVC.

Может кто-то прокомментировать этот шаблон, является ли это новым стандартом, который поддерживает MS?

4b9b3361

Ответ 1

Чтобы решить, следует ли асинхронно или синхронизировать, сравните преимущества и затраты:

Асинхронный:

  • Почти никогда не исчерпывайте пул потоков с помощью async (обстоятельства должны быть экстремальными)
  • Довольно много произвольных уровней concurrency (одновременные запросы и операции)
  • Сохраняет 1 МБ памяти на каждый сохраненный поток
  • Безопасный внутрипроцесс concurrency благодаря SynchronizationContext
  • Может увеличивать пропускную способность за счет низких двузначных процентных значений для случаев высокой нагрузки из-за снижения затрат на планирование ОС. Тем не менее, практически ни одно производственное приложение не находится под высокой загрузкой процессора, потому что, если оно было близко к недоступности (в случае всплеска нагрузки приложение начинает отбрасывать запросы).

Синхронизировать

  • Простой код: ожидание делает 99% случаев (почти) так же просто, как и синхронный код. Тем не менее, 10+ асинхронных вопросов каждый день в Qaru говорят на другом языке. Крайние случаи возникают, когда вы отклоняетесь от простого пути. Также при использовании устаревших библиотек, которые, например, требуют от вас синхронного обратного вызова.
  • Меньшая работа для кодирования и отладки
  • Профилирование (вы можете профилировать приложение или просто приостановить отладчик и посмотреть, что делает приложение прямо сейчас. Невозможно с помощью async.)
  • Взаимодействует с устаревшим кодом и библиотеками

Выберите async с ASP.NET, если вы вызываете службы с высокой задержкой. Веб-служба, вероятно, будет высокой задержкой. База данных OLTP почти всегда имеет низкую задержку.

Выберите async, если ваше приложение пользуется очень высокими уровнями concurrency (100 +). Большинство приложений не имеют таких высоких уровней, или их внутренние службы не будут поддерживать такую ​​сумму нагрузки. Нет смысла делать масштаб веб-приложения, но перегружать его. Все системы в цепочке вызовов должны извлекать выгоду из высокой степени concurrency, чтобы асинхронность была полезной.

Типичные службы с высокой задержкой (хорошие случаи для async):

  • Веб-сервисы
  • Ожидание (например, сон)
  • Дросселирование (SemaphoreSlim,...)
  • Некоторые облачные сервисы (Azure)
  • Долгосрочные запросы к базе данных (например, отчет или ETL)

Типичные службы с низкой задержкой (хорошие случаи для синхронизации):

  • Вызов базы данных: большинство запросов OLTP имеют низкую задержку, потому что вы можете предположить, что сервер базы данных не будет перегружен. Нет смысла бросать на него 100 одновременных запросов. Не делает их более быстрыми.
  • Файловая система: то же, что и базы данных.

Они классифицируются по типичному случаю. Все они могут быть и в противоположной категории.

Вы можете смешивать синхронизацию и асинхронное соединение в одном и том же приложении. Использовать async, когда он находится в его сладком месте.

Итак, почему Microsoft и команда Entity Framework поддерживают асинхронное использование? Здесь идет субъективная часть этого ответа: это может быть моя внутренняя политика Microsoft. Они могут предвидеть использование EF в клиентских приложениях (для которых async отлично). Или они не понимают, что асинхронные вызовы баз данных почти всегда являются пустой тратой времени разработчиков без преимуществ. Большинство людей этого не понимают, потому что асинк - это путь в эти дни.

Ответ 2

В ASP.NET вы должны использовать асинхронные API-интерфейсы для любых связанных с I/O-подключением, включая доступ к базе данных и вызовы веб-сервисов.

Использование async позволяет ASP.NET максимально использовать пул потоков, что приводит к нетривиальным преимуществам масштабируемости.

Ответ 3

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

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