Maison >développement back-end >C++ >Comment Async / Await peut-il conduire à des impasses en C #?
Comprendre l'async / attendre les impasses en C #
La programmation moderne repose fortement sur les opérations asynchrones, et les mots clés de C # async
/ await
offrent une approche rationalisée. Cependant, une mauvaise utilisation peut entraîner des impasses. Examinons un scénario commun:
Considérez cet exemple:
<code class="language-csharp">public ActionResult ActionAsync() { // DEADLOCK: Blocking on the async task var data = GetDataAsync().Result; return View(data); } private async Task<string> GetDataAsync() { // Simple asynchronous method var result = await MyWebService.GetDataAsync(); return result.ToString(); }</code>
Ce code tente de récupérer les données de manière asynchrone mais d'attente de manière synchrone pour le résultat en utilisant .Result
, créant une impasse. L'impasse survient comme suit:
ActionAsync
appelle GetDataAsync
. GetDataAsync
initie une demande Web asynchrone via MyWebService.GetDataAsync
. MyWebService.GetDataAsync
Renvoie une tâche incomplète. GetDataAsync
suspend, renvoyant une tâche incomplète à ActionAsync
. ActionAsync
bloque sur la tâche incomplète de GetDataAsync
, arrêtant le thread de contexte. GetDataAsync
. GetDataAsync
a besoin du thread de contexte, qui est bloqué par ActionAsync
. ActionAsync
attend GetDataAsync
, qui attend le thread de contexte bloqué. Cela illustre l'importance critique d'éviter les attentes synchrones sur les opérations asynchrones dans les méthodes asynchrones. Laissez toujours l'opération asynchrone se terminer naturellement, en utilisant await
le cas échéant.
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!