Можливо, ви знайдете корисну мою статтю про MSDN ; У цій статті я зайняв багато місця, в якому описував, коли потрібно використовуватиasync
ASP.NET, а не лише про те, як користуватися async
ASP.NET.
У мене є проблеми з використанням асинхронних дій у ASP.NET MVC. Коли це покращує продуктивність моїх програм, а коли - ні.
По-перше, зрозумійте, що async
/ await
все стосується звільнення тем . У програмах GUI йдеться головним чином звільнення потоку GUI, щоб зручніше було користуватися. У серверних додатках (включаючи ASP.NET MVC) мова йде, головним чином, про звільнення потоку запиту, щоб сервер міг масштабувати.
Зокрема, це не буде:
- Зробити ваші індивідуальні запити швидше. Насправді вони завершаться (лише підлітковий шматочок) повільніше.
- Поверніться до абонента / браузера, коли ви натиснете на
await
. await
лише "поступається" пулу потоків ASP.NET, а не браузеру.
Перше питання - чи добре використовувати асинхронні дії скрізь у ASP.NET MVC?
Я б сказав, що добре використовувати його скрізь, де ви робите I / O. Це не обов'язково може принести користьОднак (див. Нижче).
Однак це погано використовувати його для методів, пов'язаних з процесором. Іноді дияволи думають, що вони можуть отримати перевагиasync
, просто зателефонувавши Task.Run
до своїх контролерів, і це жахлива ідея. Оскільки цей код закінчується звільненням потоку запиту, зайнявши інший потік, тому користі взагалі немає (а насправді вони беруть штраф за додаткові комутатори потоку)!
Чи потрібно використовувати ключові слова асинхрон / очікування, коли я хочу запитувати базу даних (через EF / NHibernate / інші ORM)?
Ви можете використовувати будь-які доступні вам методи. Зараз більшість основних гравців підтримуютьasync
, але є кілька таких, які цього не роблять. Якщо ваш ORM не підтримує async
, то не намагайтеся завертати його Task.Run
чи щось подібне (див. Вище).
Зауважте, що я сказав "ви можете використовувати". Якщо ви говорите про ASP.NET MVC з єдиним резервним бази даних, ви (майже напевно) не отримаєте користі від масштабування async
. Це тому, що IIS може обробляти набагато більше одночасних запитів, ніж один екземпляр SQL-сервера (або іншого класичного RDBMS). Однак, якщо ваш сервер заходу більш сучасний - кластер SQL-сервера, Azure SQL, NoSQL тощо - і ваш бекенд може масштабуватися, а вузьке місце масштабування - IIS, то ви можете отримати користь від масштабування async
.
Третє запитання - Скільки разів я можу використовувати ключові слова, що очікують, щоб асинхронно запитувати базу даних в методі ОДНОЇ єдиної дії?
Скільки вам подобається. Однак зауважте, що багато ORM мають правило "одна операція на з'єднання". Зокрема, EF дозволяє проводити лише одну операцію на кожен DbContext; це вірно, незалежно від того, чи є операція синхронною чи асинхронною.
Також знову пам’ятайте про масштабованість вашого бекенда. Якщо ви потрапляєте на один екземпляр SQL Server, а ваш IIS вже здатний підтримувати SQLServer на повну потужність, то подвоєння або зменшення тиску на SQLServer взагалі не допоможе вам.