Vous pouvez trouver mon article MSDN sur le sujet utile ; J'ai pris beaucoup d'espace dans cet article décrivant quand vous devez utiliser async
sur ASP.NET, pas seulement comment utiliser async
sur ASP.NET.
J'ai quelques inquiétudes concernant l'utilisation des actions asynchrones dans ASP.NET MVC. Quand cela améliore les performances de mes applications, et quand - non.
Tout d'abord, comprenez que async
/ await
consiste à libérer des threads . Sur les applications GUI, il s'agit principalement de libérer le thread GUI afin que l'expérience utilisateur soit meilleure. Sur les applications serveur (y compris ASP.NET MVC), il s'agit principalement de libérer le thread de demande afin que le serveur puisse évoluer.
En particulier, il ne:
- Faites vos demandes individuelles plus rapidement. En fait, ils termineront (juste un peu plus jeunes) plus lentement.
- Revenez à l'appelant / navigateur lorsque vous appuyez sur un
await
. await
"cède" uniquement au pool de threads ASP.NET, pas au navigateur.
La première question est - est-il bon d'utiliser l'action asynchrone partout dans ASP.NET MVC?
Je dirais qu'il est bon de l'utiliser partout où vous effectuez des E / S. Cependant, cela ne sera pas nécessairement bénéfique (voir ci-dessous).
Cependant, il est mauvais de l'utiliser pour les méthodes liées au processeur. Parfois, les développeurs pensent qu'ils peuvent obtenir les avantages async
en appelant simplement Task.Run
leurs contrôleurs, et c'est une idée horrible. Parce que ce code finit par libérer le thread de demande en prenant un autre thread, il n'y a donc aucun avantage (et en fait, ils subissent la pénalité des commutateurs de thread supplémentaires)!
Dois-je utiliser des mots clés asynchrones / attendre lorsque je souhaite interroger la base de données (via EF / NHibernate / autre ORM)?
Vous pouvez utiliser toutes les méthodes attendues dont vous disposez. À l'heure actuelle, la plupart des principaux acteurs soutiennent async
, mais il y en a quelques-uns qui ne le font pas. Si votre ORM ne prend pas en charge async
, n'essayez pas de l'envelopper Task.Run
ou quelque chose comme ça (voir ci-dessus).
Notez que j'ai dit "vous pouvez utiliser". Si vous parlez d'ASP.NET MVC avec un seul backend de base de données, vous n'obtiendrez (presque certainement) aucun avantage d'évolutivité async
. En effet, IIS peut gérer beaucoup plus de demandes simultanées qu'une seule instance de SQL Server (ou tout autre SGBDR classique). Cependant, si votre backend est plus moderne - un cluster de serveurs SQL, Azure SQL, NoSQL, etc. - et que votre backend peut évoluer, et que votre goulot d'étranglement d'évolutivité est IIS, alors vous pouvez bénéficier d'un avantage d'évolutivité async
.
Troisième question - Combien de fois puis-je utiliser des mots-clés en attente pour interroger la base de données de manière asynchrone dans UNE seule méthode d'action?
Autant que vous voulez. Cependant, notez que de nombreux ORM ont une règle d'une opération par connexion. En particulier, EF n'autorise qu'une seule opération par DbContext; cela est vrai que l'opération soit synchrone ou asynchrone.
Gardez également à l'esprit l'évolutivité de votre backend. Si vous utilisez une seule instance de SQL Server et que votre IIS est déjà capable de maintenir SQLServer à pleine capacité, doubler ou tripler la pression sur SQLServer ne vous aidera pas du tout.