C'est ainsi que je vois les choses (et je pense que c'est aussi le cas de Microsoft si l'on regarde https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/hh191443(v=vs.110)#threads )
Async/await est un moyen rapide d'exécuter du code sur le fil d'exécution principal de l'application, avec l'avantage que le code peut se suspendre lorsqu'il n'a rien à faire et renvoyer le focus au fil d'exécution principal, se "réveiller" sur le fil d'exécution principal lorsqu'il y a un résultat à obtenir, puis renvoyer le traitement au fil d'exécution principal, vous l'aurez deviné. Pensez-y comme une instruction GOTO basée sur des événements dans Basic qui peut transmettre le contrôle à une ligne d'exécution spécifique.
En revanche, un thread est un flux d'exécution distinct qui peut fonctionner avec ses propres variables, etc. et qui, si le matériel est suffisant, est exécuté en parallèle avec le thread principal.
Si vous avez une application GUI qui va télécharger un seul fichier et faire quelque chose avec ce fichier une fois qu'il est téléchargé, je mettrais en œuvre cette méthode en utilisant une méthode async/await.
Cependant, si votre interface graphique doit télécharger 5000 fichiers, je créerais un thread de téléchargement de fichiers pour gérer cela, car le thread principal de l'interface graphique peut se figer pendant que l'exécution est transférée pour gérer le téléchargement des fichiers.