Comprendre et empêcher les blocs de blocage dans l'async / attendre de C #
c # 's async
/ await
simplifie la programmation asynchrone, mais une mauvaise utilisation peut entraîner des impasses. Examinons un scénario commun:
<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 async method var result = await MyWebService.GetDataAsync(); return result.ToString(); }</code>
L'impasse:
L'impasse survient parce que ActionAsync
, fonctionnant sur le thread principal, attend de manière synchrone GetDataAsync
pour terminer en utilisant .Result
. Tandis que await
libère normalement le thread, .Result
force une attente synchrone. Surtout, GetDataAsync
s'exécute dans le contexte du thread principal. Quand il await
s MyWebService.GetDataAsync
, il capture le contexte et attend qu'il reprenne. Mais le fil principal est bloqué, empêchant GetDataAsync
de terminer. Ceci est une impasse classique: le thread principal attend GetDataAsync
, qui attend que le fil principal libére son contexte.
Prévention des blocs de blocage:
La solution consiste à éviter de bloquer de manière synchrone les threads lors de l'utilisation de async
/ await
. Utilisez toujours await
dans les méthodes async
pour assurer une poursuite appropriée. Cela empêche le blocage du thread de contexte, permettant à l'opération asynchrone de terminer. Le code corrigé ressemblerait à ceci:
<code class="language-csharp">public async Task<ActionResult> ActionAsync() { // Correct: Awaiting the async task var data = await GetDataAsync(); return View(data); } private async Task<string> GetDataAsync() { // ... (remains unchanged) ... }</code>
par await
ing GetDataAsync
dans ActionAsync
, nous permettons au thread principal de continuer à traiter d'autres tâches tandis que GetDataAsync
s'exécute de manière asynchrone. Cela élimine l'impasse. N'oubliez pas que les méthodes async
doivent être traitées comme des opérations asynchrones et gérées en conséquence en utilisant await
.
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!