Dans .Net 4.5, Microsoft a ajouté la nouvelle Async/Await
fonctionnalité pour simplifier le codage asynchrone. Cependant, je me demande
- Peut
Async/Await
remplacer complètement l'ancienne façon d'utiliserThreads
? - Est-il
Async/Await
capable de faire tout ce qu'unThread
peut faire de manière asynchrone? - Ne
Async/Await
peut être utilisé qu'avec certaines méthodes commeWebClient.DownloadStringAsync
ou puis-je convertir n'importe quelle méthode synchrone pour la faire utiliserAsync/Await
et ne pas bloquer le thread principal?
new Thread(() => {Some Work}).Start();
?! n'est-ce pas?Réponses:
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.
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.
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.
la source
async
ne conviennent pas.await Task.Run
pour 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.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.
la source
await Task.Run
. Il y a une brève mention de Task.Run, mais ce n'est pas clair. En bout de ligne, celaawait
ne fera pas exécuter une tâche liée au processeur en parallèle, ce travail devrait donc être effectué viaawait Task.Run
.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.
la source