Вы можете найти мою статью MSDN на эту тему полезной ; В этой статье я занял много места, описывая, когда вы должны использовать asyncв ASP.NET, а не только как использовать asyncв ASP.NET.
У меня есть некоторые проблемы с использованием асинхронных действий в ASP.NET MVC. Когда это улучшает производительность моих приложений, а когда - нет.
Во-первых, понять, что async/ awaitэто все о освобождении темы . В приложениях с графическим интерфейсом главное - освободить поток графического интерфейса, чтобы пользовательский интерфейс стал лучше. В серверных приложениях (включая ASP.NET MVC) речь идет главным образом об освобождении потока запросов, чтобы сервер мог масштабироваться.
В частности, он не будет:
- Сделайте ваши индивидуальные запросы быстрее. На самом деле, они будут заканчиваться (чуть-чуть) медленнее.
- Вернитесь к вызывающему / браузеру, когда вы нажмете
await. awaitтолько «уступает» пулу потоков ASP.NET, а не браузеру.
Первый вопрос - хорошо ли использовать асинхронное действие везде в ASP.NET MVC?
Я бы сказал, что это хорошо использовать везде, где вы делаете ввод / вывод. Это не обязательно может быть полезным , хотя (см. Ниже).
Тем не менее, это плохо использовать его для методов, связанных с процессором. Иногда разработчики думают, что они могут получить выгоду async, просто вызывая Task.Runсвоих контроллеров, и это ужасная идея. Поскольку этот код в конечном итоге освобождает поток запроса, занимая другой поток, так что никакой выгоды нет вообще (и на самом деле они берут штраф за дополнительные переключатели потока)!
Должен ли я использовать ключевые слова async / await при запросе к базе данных (через EF / NHibernate / другой ORM)?
Вы можете использовать любые доступные вам методы. Сейчас большинство основных игроков поддерживают async, но есть некоторые, которые этого не делают. Если ваш ORM не поддерживает async, не пытайтесь обернуть егоTask.Run или что- роде (см. Выше).
Обратите внимание, что я сказал: «Вы можете использовать». Если вы говорите о ASP.NET MVC с одним бэкэндом базы данных, то вы (почти наверняка) не получите никакой выгоды от масштабируемости async. Это связано с тем, что IIS может обрабатывать гораздо больше одновременных запросов, чем один экземпляр SQL-сервера (или другой классической RDBMS). Однако, если ваш Бэкэнд более современный - это SQL - сервер кластер, Azure SQL, NoSQL, и т.д. - и ваш бэкенд могут масштабировать, и ваша масштабируемость узкого IIS, то вы можете получить выгоду от масштабируемости async.
Третий вопрос. Сколько раз я могу использовать ключевые слова await для асинхронного запроса к базе данных в ОДНОМ методе одиночного действия?
Столько, сколько вам нравится. Однако обратите внимание, что многие ORM имеют правило одной операции на соединение. В частности, EF допускает только одну операцию для DbContext; это верно, является ли операция синхронной или асинхронной.
Кроме того, помните о масштабируемости вашего бэкэнда снова. Если вы работаете с одним экземпляром SQL Server, и ваш IIS уже способен поддерживать SQLServer на полную мощность, то удвоение или утроение нагрузки на SQLServer вам совсем не поможет.