Maison >développement back-end >C++ >« Task.GetAwaiter().GetResult() » est-il une meilleure alternative à « Task.Result » pour le blocage synchrone ?
Task.GetAwaiter().GetResult()
est-il équivalent à Task.Result
?
Dans la programmation asynchrone, les méthodes asynchrones doivent parfois être exécutées de manière synchrone. Une solution consiste à utiliser Task.GetAwaiter().GetResult()
, mais cela peut entraîner un blocage et un épuisement des ressources du pool de threads. Cependant, il est considéré comme supérieur à Task.Wait
et Task.Result
car il propage l'exception directement au lieu de l'envelopper dans AggregateException
.
Task.GetAwaiter().GetResult()
, Task.Wait
et Task.Result
Task.Wait
et Task.Result
encapsulent automatiquement les exceptions dans AggregateException
pour la compatibilité avec les versions antérieures du framework. En revanche, Task.GetAwaiter().GetResult()
propage directement les exceptions, évitant ainsi les problèmes d'empaquetage.
Task.GetAwaiter().GetResult()
Avantages
L'équipe Microsoft PFX a déclaré que task.GetAwaiter().GetResult()
permet aux développeurs d'accéder directement à la logique de propagation des exceptions utilisée par l'opérateur await
. Ceci est utile dans les scénarios où l'exception d'origine doit être conservée sans emballage.
L'expert Stephen Cleary souligne en outre la clarté de Task.GetAwaiter().GetResult()
. Il explique qu'il exprime explicitement la vérification des erreurs et le recommande comme méthode privilégiée pour le blocage synchrone dans des cas spécifiques.
Attention :
Malgré les avantages évidents de Task.GetAwaiter().GetResult()
, le recours à celui-ci, Task.Wait
et Task.Result
doit être évité au profit de méthodes "async/await" qui sont plus appropriées et ne provoquent pas de blocages. Ces méthodes ne doivent être utilisées que dans des circonstances particulières.
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!