Je me demande si la méthode .Net HttpClient async s'exécute dans les nouveaux threads ou dans le principal.

Par exemple, dans mon application console, j'appelle une méthode async pour télécharger le contenu d'une URL à l'aide de la méthode HttpClient.GetStringAsync.

Cette méthode (GetStringAsync) s'exécutera-t-elle dans un nouveau thread séparé?

1
Mhd 5 avril 2017 à 19:53

2 réponses

Meilleure réponse

En général, les méthodes d'E / S asynchrones n'utilisent pas de threads séparés. J'explique cela en détail dans mon article de blog Il n'y a pas de fil.

Cependant, dans ce cas précis , ce n'est pas tout à fait vrai. Les API basées sur WebRequest dans .NET prennent en charge les opérations asynchrones depuis longtemps, mais ont en fait toujours effectué la détection de proxy HTTP et la recherche DNS en tant que synchrones , même via leurs API asynchrones. Cela a été remarqué lorsque HttpClient a commencé à devenir populaire. Malheureusement, Microsoft a décidé non de corriger ces bogues de longue date.

Ainsi, HttpClient encapsule ses appels WebRequest dans un thread de pool de threads. Notez qu'il utilise toujours les API "asynchrones", donc seule la partie synchrone (proxy HTTP et recherche DNS) est effectuée sur un thread de pool de threads; le reste de la demande est vraiment asynchrone. Au moins, cela est vrai pour certaines plates-formes.

7
Stephen Cleary 5 avril 2017 à 17:21

Non, car l'utilisation de async / await est principalement créée pour accomplir des tâches liées aux E / S de manière asynchrone, sans créer de nouveaux threads. Uniquement avec les tâches liées au processeur, de nouveaux threads sont créés.

0
DigheadsFerke 5 avril 2017 à 17:01