2017-09-04 2 views
0

Je pense que mon application Web souffre d'un blocage lorsque j'appelle les services de l'API YouTube. Je veux donc savoir comment résoudre ce problème de manière correcte. Je suppose que c'est un scénario similaire à celui-ci: Why does this async action hang?MVC5 - Deadlock avec des tâches asynchrones?

S'il vous plaît quelqu'un peut-il vous conseiller, en termes très simples, pourquoi mon application Web se bloque (voir les commentaires en ligne) et comment il devrait être résolu correctement? Merci!

public ActionResult Index() 
{ 
    YouTubeHelper yth = new YouTubeHelper(); 
    bool unpublishVideo = yth.UpdateVideoOnYouTube(17, "public").Result; 
} 

public async Task<bool> UpdateVideoOnYouTube(int propertyId, string publishStatus) 
{ 
..... 
    YouTubeService youtubeService = await GetYouTubeService(db); 
..... 
} 

public async Task<YouTubeService> GetYouTubeService(ApplicationDbContext db) 
{ 
.... 
    if (!await credential.RefreshTokenAsync(CancellationToken.None)) //It hangs here!! 
     { 
     .... 
    } 
.... 
} 
+0

attendent l'appel à la méthode UpdateVideoOnYoutTube et supprimer l'accès à la 'Result' proeprty – Shyju

+0

Mais je pense que le ActionResult devrait être asynchrone? Est-ce correct et bonne pratique? –

+4

yes make it 'tâche asynchrone Shyju

Répondre

2

Le blocage est expliqué here. En résumé, vos méthodes asynchrones nécessitent le contexte de demande ASP.NET avant de pouvoir aboutir, mais l'appel à Result bloque le contexte de requête ASP.NET jusqu'à ce que les méthodes asynchrones soient déjà terminées.

Pour éviter le blocage, ne bloquez pas sur le code asynchrone. Utilisez await au lieu de Result:

public async Task<ActionResult> Index() 
{ 
    YouTubeHelper yth = new YouTubeHelper(); 
    bool unpublishVideo = await yth.UpdateVideoOnYouTube(17, "public"); 
}