Maison > développement back-end > C++ > Comment les blocs de bloces asynchrones peuvent-ils se produire dans les `asynchronistes de C # /« Await »et comment peuvent-ils être évités?

Comment les blocs de bloces asynchrones peuvent-ils se produire dans les `asynchronistes de C # /« Await »et comment peuvent-ils être évités?

Susan Sarandon
Libérer: 2025-02-02 01:36:14
original
542 Les gens l'ont consulté

How Can Asynchronous Deadlocks Occur in C#'s `async`/`await` and How Can They Be Avoided?

Les impasses asynchrones dans C #: un problème de contexte de synchronisation

c # 's async / await simplifie la programmation asynchrone, mais une mauvaise manipulation des contextes de synchronisation peut entraîner des blocs de blocage. Les contextes de synchronisation garantissent que le code s'exécute sur le thread correct, mais des problèmes surviennent avec des contextes non réentrants ou monomoder comme le thread d'interface utilisateur ou le contexte de la demande ASP.NET.

Considérez ce scénario:

<code class="language-csharp">public ActionResult ActionAsync()
{
    var data = GetDataAsync().Result; // Blocking call!
    return View(data);
}

private async Task<string> GetDataAsync()
{
    var result = await MyWebService.GetDataAsync();
    return result.ToString();
}</code>
Copier après la connexion

Ici, ActionAsync bloque en attendant GetDataAsync. GetDataAsync lui-même attend une tâche d'arrière-plan. Cela crée une impasse: le thread principal (dans ActionAsync) est bloqué, empêchant la tâche d'arrière-plan de terminer, ce qui empêche à son tour GetDataAsync de terminer, résultant en une impasse perpétuelle.

L'impasse se produit parce que le contexte de synchronisation du thread principal est capturé pendant le await dans GetDataAsync, ce qui le rend dépendant de l'achèvement du thread principal. Étant donné que le thread principal est bloqué, cette dépendance empêche GetDataAsync de terminer.

La solution pour les contextes à thread unique est d'éviter de bloquer les opérations dans les méthodes async. Utilisez des techniques non bloquantes comme le sondage ou les rappels pour la synchronisation. Au lieu de .Result, utilisez await dans ActionAsync pour résoudre cet exemple spécifique.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal