ASP.NET MVC 4 async enfant d'action
J'ai un ASP.NET MVC 4 application de ciblage .NET 4.5. L'un de nos actions enfant fait un appel d'un service web à l'aide de HttpClient.
Puisque nous sommes blocage sur IO attente pour le client http de la réponse, il fait beaucoup de sens pour convertir le code de la async/await modèle. Toutefois, lorsque MVC 4 tente d'exécuter l'action enfant, nous obtenons le message d'erreur suivant:
HttpServerUtility.Exécuter bloquée en attente d'une opération asynchrone à compléter.
À première vue, il semble comme si MVC 4 ne prend pas en charge async/await dans un enfant d'action. La seule option restante est exécuté à l'aide du code synchrone et la force d'un "Wait" async task.
Comme nous le savons tous, le toucher .Le résultat ou l' .Wait() sur une tâche asynchrone dans un ASP.NET le contexte qui va provoquer un blocage immédiat. Mon async logique est enveloppé dans une bibliothèque de classe, donc je ne peux pas utiliser le "en attente de bla.ConfigureAwait(false)" astuce. Rappelez-vous, le marquage "async" l'enfant d'action et de l'utilisation attendent provoque une erreur, et qui m'empêche de configuration de l'attendent.
Je suis peint dans un coin à ce point. Est-il tout façon de consommer de méthodes asynchrones dans un MVC 4 enfant d'action? Apparaît comme un plat d'un bug avec aucune solution de rechange.
- Pourriez-vous inclure le code minimal pour montrer le problème?
Vous devez vous connecter pour publier un commentaire.
Il y a encore des parties de la MVC qui ne sont pas
async
-friendly; j'espère que ces questions seront traitées dans l'avenir. Merci de ne créer un Connecter ou UserVoice pour cette.Vous avez probablement devrait ajouter
ConfigureAwait(false)
pour les appels dans votre bibliothèque de classe (si vous pouvez).Vous pouvez également pirater une solution alternative. Si votre bibliothèque de classe de la méthode n'a pas besoin de l'ASP.NET contexte, alors vous pourriez avoir un thread du pool ne le (a)en attente pour vous:
L'effet est similaire à
ConfigureAwait(false)
: depuisMyHttpRequest
s'exécute dans un thread du pool contexte, il ne va pas tenter d'entrer dans le ASP.NET contexte quand il se termine.Le format de Stephen réponse n'a pas assez de travail pour moi (c'est peut-être un async noob problème, mais bon).
J'ai eu à faire écrire les async expression dans ce format pour obtenir une fortement typé valeur de retour.