Je suis tombé sur ce post qui parle de faire des requêtes Web asynchrones.
Maintenant, la simplicité mise à part, si dans le monde réel, tout ce que vous faites est de faire une demande asynchrone et de l'attendre à la ligne suivante, n'est-ce pas la même chose que de faire un appel de synchronisation en premier lieu?
c#
.net
asynchronous-programming
Mrchief
la source
la source
Réponses:
Non, à
async + await != sync
cause de la continuationDe MSDN «Programmation asynchrone avec Async et Await (C # et Visual Basic)»
Par exemple, l'exécution asynchrone ne bloquera pas le thread d'interface utilisateur et
Some TextBox.Text
sera mise à jour une fois le téléchargement terminéla source
Console.WriteLine(await GetStringOverNetwork());
? Que faire si vous avez besoin de la sortie de l'appel asynchrone? Le programme se bloquerait-il au premier accès, même si le thread pouvait potentiellement continuer son exécution?Non ce n'est pas pareil.
Votre
async
bloc de code attend que l'await
appel revienne pour continuer, mais le reste de votre application n'attend pas et peut continuer comme d'habitude.En revanche, un appel synchrone ferait attendre toute votre application ou thread jusqu'à ce que le code ait fini de s'exécuter pour continuer avec autre chose.
la source
S'il vous plaît permettez-moi de clarifier les choses en ce qui concerne async / wait.
Lorsque l'attente est rencontrée, la machine d'état sous-jacente permet au contrôle d'être retourné immédiatement. Ensuite, lorsque l'appel attendu est terminé, la machine d'état sous-jacente permet à l'exécution de reprendre sur la ligne après l'appel attendu.
Par conséquent, le bloc asynchrone n'est pas bloqué et n'attend pas la fin de l'appel attendu; Le contrôle est renvoyé immédiatement lorsque la commande d'attente est rencontrée.
La machine d'état sous-jacente fait partie de la "magie" derrière l'utilisation de l'async / wait qui n'est pas désaffectée et manquée.
la source
Je suis tombé dessus avec la même question à l'esprit, mais après avoir lu les réponses, la question semble persister, confuse par les références à la «magie sous le capot».
De la programmation asynchrone mentionnée ci-dessus :
Le contexte rencontré
await
est-il bloqué?Le reste de l'application se bloque-t-il sur le
await
?Cela dépend de la façon dont votre candidature est rédigée. S'il s'agit d'une série de
await
tâches ed dépendantes lancées séquentiellement dans le même contexte (voir: Essayer de comprendre un comportement asynchrone / attendre )de cette façon chacun
await
bloquerait le frai du suivant.En revanche, les mêmes tâches dépendantes lancées en parallèle s'exécuteraient en parallèle et le contexte ne se bloquerait qu'au resp.
await
:En général, l'
await
exécution renvoie au contexte externe, d'où le contexte actuel est appelé. Cependant, si le contexte extérieur lui-même attend le courant, c'est comme unawait
s séquentiel dans le même contexte.Donc, pour récolter les
async
bénéfices, il faut concevoir l'application pour exécuter plusieurs contextes parallèles (interface utilisateur, client de données, etc.), puisawait
dans un contexte, elle s'exécute dans d'autres contextes, afin que l'application entière ne bloque pas un individuawait
.la source