Il est simultanées, dans le sens que beaucoup de circulation asychronous opérations peuvent être en cours à tout moment. Il peut ou peut ne pas être multithread.
Par défaut, await
de planifier la poursuite de retour à la "contexte d'exécution en cours". Le "contexte d'exécution en cours" est défini comme SynchronizationContext.Current
si elle est non-null
ou TaskScheduler.Current
si il n'y a pas d' SynchronizationContext
.
Vous pouvez remplacer ce comportement par défaut en appelant ConfigureAwait
et en passant false
de la continueOnCapturedContext
paramètre. Dans ce cas, la poursuite ne sera pas prévu de retour à celle du contexte d'exécution. Généralement, cela signifie qu'il sera exécuté sur un pool de threads thread.
Sauf si vous écrivez le code de bibliothèque, le comportement par défaut est exactement ce qui est souhaité. WinForms, WPF et Silverlight (c'est à dire, tous les cadres de l'INTERFACE utilisateur) offre un SynchronizationContext
, de sorte que la poursuite s'exécute sur le thread d'INTERFACE utilisateur (et peut accéder en toute sécurité des objets d'INTERFACE utilisateur). ASP.NET elle fournit également une SynchronizationContext
qui garantit la poursuite s'exécute dans le bon contexte de demande.
Les autres threads (y compris le pool de threads les threads, Thread
, et BackgroundWorker
) ne fournissent pas un SynchronizationContext
. Donc la Console d'applications et de services Win32 par défaut n'ont pas d' SynchronizationContext
. Dans cette situation, les continuations exécuter sur le pool de threads les threads. C'est pourquoi l'application de Console démonstrations à l'aide de await
/async
inclure un appel à l' Console.ReadLine
/ReadKey
ou de faire un blocage Wait
sur Task
.
Si vous vous trouvez dans le besoin d'un SynchronizationContext
, vous pouvez utiliser AsyncContext
de mon Nito.AsyncEx bibliothèque; qu'il est fondamentalement juste donne un async
-compatible "boucle principale" avec un SynchronizationContext
. Je trouve ça utile pour la Console d'applications et de tests unitaires (VS2012 a maintenant un support intégré pour l' async Task
tests unitaires).
Pour plus d'informations sur l' SynchronizationContext
, voir mon Fév article MSDN.
À aucun moment, DoEvents
ou l'équivalent; plutôt, le contrôle des flux de retours tous le moyen de sortir, et de la poursuite (le reste de la fonction) est planifié pour être exécuté plus tard. C'est une solution plus propre, car il ne cause pas de réentrée questions comme vous l'avez si DoEvents
a été utilisé.