Async / Attendre vs Threads

100

Dans .Net 4.5, Microsoft a ajouté la nouvelle Async/Awaitfonctionnalité pour simplifier le codage asynchrone. Cependant, je me demande

  1. Peut Async/Awaitremplacer complètement l'ancienne façon d'utiliser Threads?
  2. Est-il Async/Awaitcapable de faire tout ce qu'un Threadpeut faire de manière asynchrone?
  3. Ne Async/Awaitpeut être utilisé qu'avec certaines méthodes comme WebClient.DownloadStringAsyncou puis-je convertir n'importe quelle méthode synchrone pour la faire utiliser Async/Awaitet ne pas bloquer le thread principal?
Ratskey romain
la source
2
Les threads et Async / Await sont des fonctionnalités indépendantes. Vous pouvez les combiner, mais ce n'est pas obligatoire.
dtb
2
Je pensais qu'Async / Await faisait la même chose que new Thread(() => {Some Work}).Start();?! n'est-ce pas?
Roman Ratskey
2
Nan. Votre hypothèse n'est pas correcte. Vous pensez peut-être à Task.Run (TPL), qui est souvent combiné avec Async / Await, mais qui n'est pas non plus lié et n'a pas besoin d'être utilisé avec lui.
dtb
4
@dtb: Alors, quand utiliser Async / Await et quand utiliser Threads?. Je suis vraiment confus sur la différence entre Task.Run, Thread.Start, Async / Await. Si vous pouviez me fournir une bonne explication qui me fasse comprendre les différences entre eux, je serais très reconnaissant
Roman Ratskey
2
Async / await ne crée pas ou n'utilise d'aucune autre manière les threads.
wRAR

Réponses:

79

peut-il remplacer complètement l'ancienne façon d'utiliser Threads?

Un fil peut faire beaucoup plus de choses utiles. Await est spécialement conçu pour traiter quelque chose qui prend du temps, le plus souvent une demande d'E / S. Ce qui était traditionnellement fait avec un rappel lorsque la demande d'E / S était terminée. L'écriture de code qui repose sur ces rappels est assez difficile, attendre le simplifie grandement.

capable de faire ce qu'un thread peut faire de manière asynchrone?

Grossièrement. Await s'occupe simplement de gérer le retard, sinon il ne fait rien de ce qu'un thread fait. L' expression d' attente , qui se trouve à droite du mot-clé await, est ce qui fait le travail. Idéalement, il n'utilise pas du tout de thread, il publie une demande de pilote et une fois que le pilote a terminé le transfert de données, il génère un rappel de notification d'achèvement. La mise en réseau est de loin l'utilisation la plus courante, des latences de centaines de millisecondes sont courantes et un effet secondaire inévitable des services passant du bureau ou d'un LAN vers le «cloud». L'utilisation de ces services de manière synchrone rendrait une interface utilisateur assez insensible.

ne peut être utilisé qu'avec certaines méthodes comme WebClient.DownloadStringAsync

Non. Vous pouvez l'utiliser avec n'importe quelle méthode qui renvoie une tâche. Les méthodes XxxxAsync () ne sont que des méthodes précuites dans le framework .NET pour les opérations courantes qui prennent du temps. Comme télécharger des données à partir d'un serveur Web.

Hans Passant
la source
4
Dans l'aspect C # moderne, quelle est la meilleure approche pour réaliser des rappels asynchrones sur des API externes?
bonCodigo
5
Couvert dans le dernier paragraphe, utilisez une tâche.
Hans Passant
Je m'attendrais à ce qu'un thread puisse faire quelque chose qui ne peut pas être fait via la programmation asynchrone à titre d'exemple.
Saeed Neamati
1
Pourriez-vous développer "Un thread peut faire beaucoup plus de choses utiles."? Il serait utile de comprendre les fonctionnalités fournies par les threads qui asyncne conviennent pas.
Benjohn
1
À noter await Task.Runpour le travail lié au processeur. Si je comprends bien, cela accomplit parfois ce que l'on créerait autrement un fil, ou un travailleur d'arrière-plan, à faire.
ToolmakerSteve
15

La déclaration officielle à ce sujet. Cependant, vous devez comprendre les différences entre les threads et la programmation asynchrone avant de remplacer aveuglément une chose par d'autres.

wRAR
la source
C'est comme la première ressource que j'ai lue sur Threads et Async / Await qui est claire et concise.
Arman Bimatov
2
Cette réponse ne contient qu'un lien vers la documentation. Comme le lien peut devenir obsolète, la réponse peut également devenir obsolète - ou pire encore - complètement inutile. Nous encourageons les utilisateurs de Stack à publier les parties pertinentes des liens directement dans leur question.
HimBromBeere
1
Malheureusement, la déclaration officielle n'explique pas quand faire await Task.Run. Il y a une brève mention de Task.Run, mais ce n'est pas clair. En bout de ligne, cela awaitne fera pas exécuter une tâche liée au processeur en parallèle, ce travail devrait donc être effectué via await Task.Run.
ToolmakerSteve
2

J'y pense de cette façon (et je pense que Microsoft le fait aussi si vous regardez 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 thread principal de l'application avec l'avantage que le code peut se suspendre lorsqu'il n'a aucun travail à faire et renvoyer le focus au thread principal, "se réveiller" sur le thread principal quand il est un résultat à obtenir, puis à renvoyer le traitement - vous l'avez deviné - au thread principal. Pensez-y comme une instruction GOTO basée sur un événement dans Basic qui peut passer le contrôle dans les deux sens à une ligne d'exécution spécifique.

En revanche, un thread est un flux d'exécution distinct qui peut s'exécuter avec ses propres variables, etc. où - avec un matériel suffisant - l'exécution se produit en parallèle avec le thread principal.

Si vous avez une application GUI qui va télécharger un seul fichier, puis faire quelque chose avec ce fichier une fois téléchargé - je l'implémenterais en utilisant une méthode async / await.

Cependant, si votre interface graphique a besoin de télécharger 5000 fichiers, je créerais un fil de téléchargement de fichier pour gérer cela, car le fil GUI principal peut se figer pendant le transfert de l'exécution pour gérer le téléchargement des fichiers.

xflowXen
la source