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

Ma méthode renvoie la Task . Je veux attendre la fin. Que dois-je utiliser .Wait() ou .GetAwaiter().GetResult() ? Quelle est la différence entre eux?

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 le traitement des exceptions. Avec Wait , la trace de la stack d’exception est inchangée et représente la stack réelle au moment de l’exception. Par conséquent, si vous avez un morceau de code qui s’exécute sur un thread de pool de threads, vous aurez une stack comme

 ThreadPoolThread.RunTask YourCode.SomeWork 

D’autre part, .GetAwaiter().GetResult() va retravailler la trace de la stack pour prendre en compte tout le contexte asynchrone, en ignorant que certaines parties du code s’exécutent sur le thread d’interface utilisateur, et d’autres sur un thread ThreadPool, et d’autres simplement des E / S asynchrones. Ainsi, votre trace de stack reflétera une étape synchrone dans votre code :

 TheSyncMethodThatWaitsForTheAsyncMethod YourCode.SomeAsyncMethod SomeAsync YourCode.SomeWork 

Cela tend à rendre les traces de stack d’exception beaucoup plus utiles, c’est le moins qu’on puisse dire. Vous pouvez voir où YourCode.SomeWork été appelé dans le contexte de votre application , plutôt que “la manière physique dont il a été exécuté”.

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