Quelle est la différence entre les deux .Wait() vs .GetAwaiter().GetResult()?
Ma méthode renvoie Task
. Je veux attendre jusqu'à ce qu'il a fini. Que dois-je utiliser
.Wait()
ou .GetAwaiter().GetResult()
? Quelle est la différence entre eux?
Vous devez vous connecter pour publier un commentaire.
Les deux sont synchrone d'attendre le résultat de l'opération (et il faut éviter si possible).
La différence est principalement dans la gestion des exceptions. Avec
Wait
, la trace de pile d'exception n'est pas modifiée et représente le véritable pile au moment de l'exception, donc, si vous avez un morceau de code qui s'exécute sur un thread du pool de thread, vous auriez une pile commeD'autre part,
.GetAwaiter().GetResult()
va retravailler la trace de la pile à prendre toutes les asynchrones compte du contexte, ignorant que certaines parties du code à exécuter dans le thread de l'INTERFACE utilisateur, et certains sur un pool de threads thread, et certains sont tout simplement asynchronous I/O. Si votre trace de la pile sera l'expression d'une synchrone comme l'étape à travers votre code:Ce qui tend à faire de la pile d'exception traces beaucoup plus utile, pour dire le moins. Vous pouvez voir où
YourCode.SomeWork
a été appelé dans le contexte de votre application, plutôt que "la physique de la façon dont il a été exécuté".Un exemple de la façon dont cela fonctionne est dans le source de référence (non contractuelle, bien sûr).
TaskAwaiter
est un détail d'implémentation. D'autre part, la awaitable/awaiter mécanisme est documenté, et utilise duck-typing -GetAwaiter
est àawait
commeGetEnumerator
est àforeach
ouDispose
est àusing
. Tout cela est défini dans la spécification C# quelle que soit la awaiter utilisé noter queTask.GetAwaiter
est "prévu pour le compilateur utiliser plutôt que pour les utiliser dans le code de l'application." Mais le point est que le but recherché est de faire unawait
, pasWait()
niGetAwaiter().GetResult()
- maisGetResult
vous donne plus agréable piles si vous en avez besoin.