Async et attendre dans le contrôleur MVC 4
Chaque fois que j'essaie d'utiliser la nouvelle Async
et Await
opérateurs et de retourner une collection d'objets à partir d'une base de données, j'obtiens une Invalid Operation
exception. Lorsque je l'utilise uniquement le retour d'un seul Élément, il fonctionne très bien.
Contrôleur De Code:
public async Task<ActionResult> EnvironmentList()
{
EfEnvironmentDataAccess dataAccess = new EfEnvironmentDataAccess();
ICollection<Environment> environments = await dataAccess.GetAllEnvironmentsAsync();
return PartialView(environments);
}
Afficher Le Code:
<div class="ECURightCol">
<h3>Table Dumps</h3>
@Html.Action("EnvironmentList", "Environment")
@Html.Action("ComputerList", "Computer")
@Html.Action("ProductList", "Product")
@Html.Action("InstanceList", "Instance")
@Html.Action("ProfileList", "Profile")
Le Code D'Accès Aux Données:
public ICollection<Environment> GetAllEnvironments()
{
using (EcuWebDataContext db = new EcuWebDataContext())
{
return db.Environments.OrderBy(e => e.Name).ToList();
}
}
public async Task<ICollection<Environment>> GetAllEnvironmentsAsync()
{
return await Task.Run(() => GetAllEnvironments());
}
L'Erreur que j'obtiens est:
Description: Une exception non gérée s'est produite pendant l'exécution de la demande web actuelle. Veuillez consulter la trace de la pile pour plus d'informations sur l'erreur et où elle a son origine dans le code.
Détails De L'Exception: System.InvalidOperationException: HttpServerUtility.Exécuter bloquée en attente d'une opération asynchrone à compléter.
source d'informationauteur twreid
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous ne pouvez pas utiliser le traitement asynchrone avec enfant des actions et je suppose que c'est ce que vous essayez de faire.
Deuxièmement, tu ne fais pas de traitement asynchrone ici par la mise en rotation d'un autre thread pour exécuter votre code en dessous de la ligne de code:
Il permet de bloquer un thread à la fin de la journée et vous n'aurez rien, mais un changement de contexte généraux. EF6 aura le soutien pour le traitement asynchrone. Pour les requêtes asynchrones avec pure ADO.NET, jetez un oeil:
Asynchrone Appels de Base de données Avec de la Tâche Modèle de Programmation Asynchrone (TAP) dans ASP.NET MVC 4
Il a été un certain temps depuis que cette question a été répondue. Mais j'ai eu une situation similaire avec MVC 5 et j'ai été capable de faire un [ChildActionOnly] de travailler de manière asynchrone juste en commentant la ligne suivante sous
<system.web>
section de web.fichier de configuration.EDIT:
Considérez ceci une solution alors que vous trouver une vraie solution pour votre situation. Veuillez voir Leri les commentaires ci-dessous.