Je suis tombé sur les meilleures pratiques en matière de programmation asynchrone en utilisant le langage C#. async
/ await
mots-clés (je suis nouveau en c# 5.0).
L'un des conseils donnés était le suivant :
Stabilité : Connaissez vos contextes de synchronisation
... Certains contextes de synchronisation sont non rentrants et monofilaires. Cela signifie qu'une seule unité de travail peut être exécutée dans le contexte à un moment donné. C'est le cas, par exemple, du thread de l'interface utilisateur Windows ou du contexte de requête ASP.NET. Dans ces contextes de synchronisation à un seul thread, il est facile de se bloquer. Si vous lancez une tâche à partir d'un contexte monofilaire, puis attendez cette tâche dans le contexte, votre code d'attente peut bloquer la tâche d'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 fil de discussion principal se transforme en un nouveau fil de discussion dans le dossier de l'entreprise. MyWebService.GetDataAsync();
mais comme le fil principal attend à cet endroit, il attend le résultat dans le fichier GetDataAsync().Result
. En attendant, disons que les données sont prêtes. Pourquoi le thread principal ne continue-t-il pas sa logique de continuation et ne renvoie-t-il pas un résultat de type chaîne de caractères de la part de GetDataAsync()
?
Quelqu'un peut-il m'expliquer pourquoi il y a un blocage dans l'exemple ci-dessus ? Je ne vois pas du tout quel est le problème...