#c# #asynchronous
Вопрос:
Я использую шаблон репозитория в своем решении. В общем репозитории общие методы (Добавление, Обновление и Получение) все используют асинхронные методы.
У меня также есть отдельный уровень приложений, а также уровень презентации, на котором в настоящее время находится проект MVC.
Мой вопрос в том, достаточно ли того, чтобы шаблон репозитория использовал асинхронные методы? Или я должен также сделать так, чтобы мои интерфейсы приложений использовали асинхронность, а мои контроллеры MVC были асинхронными методами?
Я совершенно запутался в этом вопросе, поэтому буду признателен за любую помощь.
Комментарии:
1. Да, вам понадобится «асинхронность на всем пути».
2. Любой метод, вызывающий
async
операцию, сам по себе должен бытьasync
операцией. (Если только у вас нет очень веской причины этого не делать, и вы действительно понимаете, что происходит под капотом, и готовы это объяснить…)3. @David спасибо.. Не могли бы вы открыть ту часть, где вы говорите: «Что происходит под капотом и готов это объяснить»?
4. @SubliminalHash: При всех разумных намерениях и целях вам не нужно будет беспокоиться об этом. Просто используйте
async
await
ключевые слова и, и ваши методы органично войдутasync
«полностью». Но если вы действительно хотите погрузиться глубже, начните с поиска в Google чего-то вроде «c# async в глубине» и начните читать/ковыряться. На эту тему есть целые книги.5. @Дэйв, большое тебе спасибо!
Ответ №1:
Чтобы создать асинхронный API, вам нужно сделать все методы от начала до конца асинхронными. Асинхронность на самом деле полезна для операций, связанных с вводом-выводом, таких как работа с файлами и сетями. Почему? Поскольку операции ввода-вывода обрабатываются процессором, а не потоками, поэтому в течение этого периода вызов API ввода-вывода и завершение операции ввода-вывода поток является Idel. Когда операция завершена, поток выполняет остальные оставшиеся шаги. При асинхронном использовании метода вы фактически освобождаете поток и позволяете другим запросам, поступающим в приложение, обслуживаться быстрее, в этом случае, когда операция ввода-вывода завершила другой поток или то же самое делает все остальное, в результате вы повышаете пропускную способность в своем приложении. Это путешествие фактически начинается с веб-сервера, такого как IIS или ngInit.
Например, в IIS по умолчанию используется 5000 потоков для обслуживания запросов, поступающих на сервер. Когда ваш API синхронен, каждый запрос, поступающий на сервер, IIS назначает ему поток, и этот поток отвечает за получение результата от вашего API, если метод синхронен и использует операцию ввода-вывода, то поток занят до конца операции, когда другой запрос поступает на сервер, IIS назначает другой поток из пула потоков для запроса., поэтому, если он будет продолжен, у IIS не будет свободного потока, поэтому он начинает ставить запросы в очередь, пока не появится свободный поток для обработки запроса, через некоторое время у IIS не будет даже достаточно места для запроса в очередь, чтобы сервер больше не получал никаких запросов. Именно здесь асинхронные API приходят на помощь. Они помогают освободить потоки в операциях ввода-вывода, тогда IIS может обслуживать больше запросов