Maison >développement back-end >C++ >Attendre une tâche ou une tâche.Résultat : quelle est la différence ?
await Task<T>
contre Task<T>.Result
en programmation asynchrone
Comprendre la différence fondamentale entre await Task<T>
et Task<T>.Result
est primordial pour une programmation asynchrone efficace. Illustrons cela avec un exemple pratique.
Considérez cette méthode :
<code class="language-csharp">public async Task<string> GetName(int id) { Task<string> nameTask = Task.Factory.StartNew(() => string.Format("Name matching id {0} = Developer", id)); return nameTask.Result; }</code>
Ici, Task<T>.Result
est utilisé pour récupérer le résultat de la tâche. Cependant, cette approche peut avoir de graves conséquences sur la concurrence, car elle oblige le thread appelant à attendre de manière synchrone la fin de la tâche.
La programmation asynchrone résout ce problème avec élégance à l'aide de l'opérateur await
, qui permet une suspension non bloquante. Voici la version améliorée et asynchrone :
<code class="language-csharp">public async Task<string> GetName(int id) { Task<string> nameTask = Task.Factory.StartNew(() => string.Format("Name matching id {0} = Developer", id)); return await nameTask; }</code>
Avec await
, le thread appelant est libéré, permettant à d'autres tâches de se poursuivre. Une fois la tâche attendue terminée, le fil reprend et le résultat est renvoyé de manière transparente.
Essentiellement : await Task<T>
facilite un véritable fonctionnement asynchrone en cédant le thread, tandis que Task<T>.Result
bloque le thread jusqu'à la fin de la tâche. Une distinction cruciale réside dans la façon dont les exceptions sont gérées : Result
encapsule les exceptions dans AggregateException
, tandis que await
renvoie directement l'exception d'origine.
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!