web-dev-qa-db-fra.com

Quand utiliser @await Html.PartialAsync dans une vue dans MVC 6

J'ai remarqué sur l'un des blogs de Scott Hanselman qu'il utilise le code suivant dans ses vues lors de l'utilisation de .Net 5 (MVC 6):

@await Html.PartialAsync("_LoginPartial")

vs.

@Html.Partial("_LoginPartial")

Existe-t-il encore de la documentation sur le moment auquel utiliser?

37
RickJames

Il s'agit en fait d'une question et d'un scénario assez intéressants. Dans une certaine mesure, l'async est la nouvelle hotness (bien que ce ne soit vraiment pas si nouveau). Entity Framework 6 a frappé avec des méthodes asynchrones et chaque ... seule ... pièce ... de ... documentation ... commençant soudainement à utiliser async pour tout. Je pense que nous voyons un peu la même chose ici. MVC 6 prend en charge l'async pour des choses comme le rendu des partiels, donc OMG nous avons tous juste ont pour utiliser async maintenant.

Async sert un objectif très spécifique. Il permet au thread actif d'être renvoyé au pool pour mettre en champ d'autres tâches pendant que la tâche en cours est dans un état d'attente. L'élément clé est "l'état d'attente". Certaines tâches sont tout simplement incompatibles avec async. Un travail lié au processeur comme une analyse financière complexe ne permet jamais au thread d'entrer dans un état d'attente, donc tout est effectivement exécuté comme synchronisation même si vous le configurez comme asynchrone. D'un autre côté, les choses impliquant une latence du réseau (demande d'une ressource à partir d'une API Web, interrogation d'une base de données, etc.) ou qui sont liées aux E/S (lecture/écriture de fichiers, etc.) peuvent parfois avoir des périodes où le thread est attendre qu'un autre processus se termine avant de poursuivre le traitement.

En ce qui concerne spécifiquement le rendu d'un partiel, le seul élément qui n'est pas entièrement lié au processeur est la lecture du fichier de vue lui-même à partir du système de fichiers. Bien que cela soit techniquement suffisant pour le rendre éligible pour l'async, combien de temps cela prendra-t-il vraiment pour lire ce qui est essentiellement un fichier texte qui est probablement inférieur à 50 Ko maximum. Au moment où le thread est restitué au pool, il est probablement temps de le demander à nouveau, vous utilisez donc les ressources de manière plus inefficace à ce stade.

Long et court, ne tombez pas dans le piège du "ça peut être fait asynchrone, donc je dois le faire asynchrone". Chaque utilisation doit être évaluée en fonction de sa valeur réelle. Async a beaucoup de frais généraux, et si vous ne parlez que de quelques millisecondes de temps d'attente, cela ne vaut probablement pas tous ces frais supplémentaires.

34
Chris Pratt

Selon la documentation ASP.NET MVC sur les vues partielles. https://docs.asp.net/en/latest/mvc/views/partial.html

La méthode PartialAsync est disponible pour les vues partielles contenant du code asynchrone (bien que le code dans les vues soit généralement déconseillé):

Aussi la note sur la page.

Si vos vues doivent exécuter du code, le modèle recommandé consiste à utiliser un composant de vue au lieu d'une vue partielle.

Vous devez donc utiliser Partial et éviter PartialAsync, et si vous vous retrouvez avec un PartialAsync vous devez vous demander si vous faites quelque chose de mal, peut-être devriez-vous utiliser un ViewComponent à la place ou déplacez la logique de la vue vers le contrôleur.

12
Fred

En ce qui concerne "attendre Html.PartialAsync" - ce lien peut vous aider - http://aspnetwebstack.codeplex.com/workitem/601 (suivez également les commentaires) (quant à ce qui était exactement le problème) avant).

Je travaille sur un site Web public construit sur MVC 6 et "attendre Html.PartialAsync" est plus rapide que "Html.Partial" - en particulier lorsque la vue contient beaucoup de composants.

La suppression de l'attente de Html.PartialAsync ne fonctionne évidemment pas et Html.PartialAsync crache le nom du type (c'est-à-dire, "System.Threading.Tasks.Task`1 [Microsoft.AspNet.Mvc.Rendering.HtmlString]")) au lieu de la vue réelle.

1
Krishna S Santosh