Question

J'ai une action de recherche qui a deux chemins, un chemin synchrone, qui renvoie simplement une vue simple et un chemin asynchrone, qui fait la recherche de manière asynchrone puis retourne une vue. Les deux sont des demandes d'obtenir, ils font donc partie de la même action.

Le problème est que lorsque j'accède à l'action "localhost: xxxx / home / recherche", la page juste des charges infiniment. Utilisation de Fiddler, je peux voir que la demande ne revient jamais. Je l'ai débogué et cela rend la dernière ligne du code, mais encore une fois, la demande ne fonctionne pas.

J'ai simplifié la reproduction aux éléments suivants:

public async Task<ActionResult> Search() 
{ 
    return View(); 
} 

vs11 me met en garde que le code sera exécuté de manière synchrone sans attendre, c'est bien, mais la demande ne fonctionne pas.

Si cela fonctionne? Ou dois-je faire autre chose ici?

Modifier

Ceci est MVC 4 ciblant .NET 4.5.

Edit 2

Pour ceux qui voient mieux en code, c'est pourquoi j'ai besoin synchrone dans une action asynchrone:

public async Task<ActionResult> Search(string query = null)
{
    if (string.IsNullOrWhiteSpace(query))
        return View(new SearchViewModel());   // never loads

    var model = await _someService.SearchAsync(query);
    return View(model);    // loads
}

Était-ce utile?

La solution

Ceci est un bug connu dans la bêta. Pour citer Stephen Toub:

La réponse courte est qu'il existe un bug connu dans ASP.NET MVC dans la version 4.5 de .NET 4,5 qui entraîne ce problème lorsque la méthode ASYNC se termine de manière synchrone.Jusqu'à ce qu'un correctif soit disponible, une solution de contournement simple consiste à ajouter "attendre la tâche.yield ();"comme première ligne de la méthode ASYNC, le forçant à compléter de manière asynchrone.Pour que cela fonctionne correctement, vous devez également vous assurer que vous utilisez la nouvelle synchronisationContext fournie par ASP.NET dans .NET 4.5, ce qui signifie que vous avez la ligne:

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />

Dans la section AppSettings de votre fichier de configuration.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top