Comprendre les blocs de blocage dans Async / Await (C #)
Les impasses sont un problème courant lors de l'utilisation de C # 'S async
/ await
dans des contextes monomoder comme des threads d'interface utilisateur ou des contextes de demande ASP.NET. Cela se produit en raison de la façon dont le contexte de synchronisation interagit avec les opérations asynchrones.
La racine de l'impasse
Une impasse survient lorsqu'une méthode asynchrone, disons GetDataAsync
, est appelée de manière synchrone, puis son résultat est attendu en utilisant .Result
. Cela bloque le fil unique. Parce que la continuation de GetDataAsync
a besoin de ce même thread (le contexte de synchronisation capturé), il ne peut pas s'exécuter, créant une impasse.
La solution: approches non bloquantes
La clé pour éviter cela est d'éviter de bloquer le fil unique. Au lieu d'attendre de manière synchrone que l'opération asynchrone se termine, utilisez une approche non bloquante:
<code class="language-csharp">public ActionResult ActionAsync() { // NON-BLOCKING ASYNC OPERATION GetDataAsync().ContinueWith(task => { var data = task.Result; // Access result safely here return View(data); }); return View();//or some other non-blocking return }</code>
Ici, ContinueWith
planifie une continuation qui exécute une fois GetDataAsync
termine. Cela libère le fil principal, permettant à la continuation d'exécuter sur le même fil lorsque l'opération asynchrone se termine. Cela empêche l'impasse. Notez que le return View()
pourrait avoir besoin d'être ajusté en fonction du cadre spécifique et du comportement souhaité. Un rendement plus approprié peut être Ok()
ou similaire, selon le contexte.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!