web-dev-qa-db-fra.com

Quelle est la différence entre .Wait () et .GetAwaiter (). GetResult ()?

Ma méthode retourne Task. Je veux attendre que ça soit fini. Que devrais-je utiliser .Wait() ou .GetAwaiter().GetResult()? Quelle est la différence entre eux?

63
user6011767

Les deux sont une attente synchrone du résultat de l'opération (et vous devriez les éviter si possible).

La différence réside principalement dans la gestion des exceptions. Avec Wait, la trace de la pile d’exceptions est inchangée et représente la pile réelle au moment de l’exception. Ainsi, si vous avez un morceau de code qui s’exécute sur un thread de pool de threads, vous obtenez une pile de type

ThreadPoolThread.RunTask
YourCode.SomeWork

D'autre part, .GetAwaiter().GetResult() retravaillera la trace de la pile pour prendre en compte tout le contexte asynchrone, en ignorant que certaines parties du code sont exécutées sur le thread d'interface utilisateur, et d'autres sur un thread ThreadPool, et d'autres simplement. E/S asynchrone. Ainsi, votre trace de pile reflétera une étape de type synchrone dans votre code :

TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork

Cela tend à rendre les traces de pile d'exceptions beaucoup plus utiles, pour le moins qu'on puisse dire. Vous pouvez voir où YourCode.SomeWork A été appelé dans le contexte de votre application , plutôt que "la manière physique avec laquelle il a été exécuté".

Un exemple de la façon dont cela fonctionne est dans le source de référence (non contractuel, bien sûr).

74
Luaan