Il me manque peut-être quelque chose
Vous êtes.
quelle est la difference entre faire Task.Wait
et await task
?
Vous commandez votre déjeuner au serveur du restaurant. Un moment après avoir donné votre commande, un ami entre et s'assoit à côté de vous et commence une conversation. Vous avez maintenant deux choix. Vous pouvez ignorer votre ami jusqu'à ce que la tâche soit terminée - vous pouvez attendre que votre soupe arrive et ne rien faire d'autre pendant que vous attendez. Ou vous pouvez répondre à votre ami, et lorsque votre ami cesse de parler, le serveur vous apportera votre soupe.
Task.Wait
bloque jusqu'à ce que la tâche soit terminée - vous ignorez votre ami jusqu'à ce que la tâche soit terminée. await
continue de traiter les messages dans la file d'attente de messages, et lorsque la tâche est terminée, il met en file d'attente un message qui dit "reprendre là où vous vous étiez arrêté après cette attente". Vous parlez à votre ami, et quand il y a une pause dans la conversation, la soupe arrive.
Task
qui prend 10 ms exécute réellement 10 heuresTask
sur votre thread, vous bloquant ainsi pendant 10 heures?Pour démontrer la réponse d'Eric, voici un code:
la source
//If you press Button2 now you won't see anything in the console until this task is complete and then the label will be updated!
" est trompeuse. En appuyant sur le bouton avec let.Wait();
gestionnaire d'événements de clic sur le bouton,ButtonClick()
il n'est pas possible d'appuyer sur quoi que ce soit, puis de voir quelque chose dans la console et de mettre à jour l'étiquette "jusqu'à ce que cette tâche soit terminée" car l'interface graphique est figée et ne répond pas, c'est-à-dire les clics ou interactions avec l'interface graphique sont PERDUS jusqu'à la fin de la tâche en attentet.Wait
va bloquer sur le thread principal jusqu'à ce que la tâche soit terminée."Cet exemple montre très clairement la différence. Avec async / wait, le thread appelant ne se bloquera pas et continuera à s'exécuter.
Sortie DoAsTask:
Sortie DoAsAsync:
Mise à jour: exemple amélioré en affichant l'ID de thread dans la sortie.
la source
Wait (), provoquera l'exécution de code potentiellement asynchrone de manière synchronisée. attendre ne sera pas.
Par exemple, vous disposez d'une application Web asp.net. UserA appelle / getUser / 1 endpoint. Le pool d'applications asp.net choisira un thread dans le pool de threads (Thread1) et ce thread fera un appel http. Si vous faites Wait (), ce thread sera bloqué jusqu'à la résolution de l'appel http. Pendant qu'il attend, si UserB appelle / getUser / 2, le pool d'applications devra servir un autre thread (Thread2) pour effectuer à nouveau un appel http. Vous venez de créer (enfin, récupéré du pool d'applications en fait) un autre thread sans raison, car vous ne pouvez pas utiliser Thread1, il a été bloqué par Wait ().
Si vous utilisez wait sur Thread1, SyncContext gèrera la synchronisation entre Thread1 et l'appel http. Simplement, il vous avertira une fois l'appel http terminé. Pendant ce temps, si UserB appelle / getUser / 2, vous utiliserez à nouveau Thread1 pour passer un appel http, car il a été libéré une fois que wait a été atteint. Ensuite, une autre demande peut l'utiliser, encore plus. Une fois l'appel http terminé (utilisateur1 ou utilisateur2), Thread1 peut obtenir le résultat et revenir à l'appelant (client). Thread1 a été utilisé pour plusieurs tâches.
la source
Dans cet exemple, pas beaucoup, pratiquement. Si vous attendez une tâche qui revient sur un thread différent (comme un appel WCF) ou qui abandonne le contrôle au système d'exploitation (comme File IO), wait utilisera moins de ressources système en ne bloquant pas un thread.
la source
Dans l'exemple ci-dessus, vous pouvez utiliser "TaskCreationOptions.HideScheduler" et modifier considérablement la méthode "DoAsTask". La méthode elle-même n'est pas asynchrone, comme cela arrive avec "DoAsAsync" car elle retourne une valeur "Task" et est marquée comme "async", faisant plusieurs combinaisons, c'est ainsi qu'elle me donne exactement la même chose qu'en utilisant "async / wait" :
la source