Je suis tombé sur quelques bonnes pratiques pour la programmation asynchrone en utilisant les mots async
- await
clés / c # (je suis nouveau sur c # 5.0).
L'un des conseils donnés était le suivant:
Stabilité: connaissez vos contextes de synchronisation
... Certains contextes de synchronisation sont non réentrants et monothread. Cela signifie qu'une seule unité de travail peut être exécutée dans le contexte à un moment donné. Le thread d'interface utilisateur Windows ou le contexte de demande ASP.NET en est un exemple. Dans ces contextes de synchronisation à un seul thread, il est facile de se bloquer soi-même. Si vous créez une tâche à partir d'un contexte à thread unique, puis attendez cette tâche dans le contexte, votre code d'attente peut bloquer la tâche en arrière-plan.
public ActionResult ActionAsync()
{
// DEADLOCK: this blocks on the async task
var data = GetDataAsync().Result;
return View(data);
}
private async Task<string> GetDataAsync()
{
// a very simple async method
var result = await MyWebService.GetDataAsync();
return result.ToString();
}
Si j'essaie de le disséquer moi-même, le thread principal apparaît dans un nouveau MyWebService.GetDataAsync();
, mais comme le thread principal y attend, il attend le résultat GetDataAsync().Result
. En attendant, disons que les données sont prêtes. Pourquoi le thread principal ne poursuit-il pas sa logique de continuation et renvoie-t-il un résultat de chaîne GetDataAsync()
?
Quelqu'un peut-il m'expliquer pourquoi il y a une impasse dans l'exemple ci-dessus? Je ne sais absolument pas quel est le problème ...