Exécution synchrone de tâches asynchrones : la différence entre Task.Result et Task.GetAwaiter().GetResult()
Lorsque vous utilisez des méthodes asynchrones, vous devez parfois les exécuter de manière synchrone. Cependant, il existe deux manières courantes d'exécuter de manière synchrone : Task.Result
et Task.GetAwaiter().GetResult()
, et il existe des différences clés entre elles.
Comparaison de Task.Wait et Task.GetAwaiter().GetResult()
Task.Wait
et Task.GetAwaiter().GetResult()
permettent tous deux d'exécuter des tâches asynchrones de manière synchrone. Cependant, leurs mécanismes de gestion des exceptions sont différents. Task.Wait
enveloppe toute exception dans AggregateException
, tandis que Task.GetAwaiter().GetResult()
lève directement l'exception d'origine.
Suggestions
Pour gérer directement les exceptions brutes, Task.GetAwaiter().GetResult()
est meilleur que Task.Wait
. Cependant, les deux méthodes doivent être évitées au profit de l'utilisation de async/await
car les deux premières peuvent entraîner des blocages et des problèmes d'épuisement des ressources du pool de threads.
Raison de la différence
La différence de gestion des exceptions entreTask.Wait
et Task.GetAwaiter().GetResult()
provient des exigences strictes de compatibilité de Microsoft. Pour éviter de casser le code existant, Task.Wait
conserve son comportement de blocage d'origine, en encapsulant les exceptions dans AggregateException
.
Pour déclencher directement la propagation des exceptions, vous pouvez utiliser task.GetAwaiter().GetResult()
. Notez que Task.Result
vérifie les erreurs de tâche plutôt que de bloquer son exécution.
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!