Асинхронное программирование в шаблоне репозитория C#

#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 может обслуживать больше запросов