La compréhension du contexte en C# 5 async/await
Suis-je correct que async/await lui-même n'a rien à faire avec la concurrence d'accès/parallélisme et n'est rien de plus que la continuation passing style (CPS) de la mise en œuvre? Et le réel, le filetage est réalisé par SynchronizationContext
instance await
passe/restaure?
Si c'est correct, j'ai la question suivante sur SynchronizationContext
:
il garantit qu'une suite sera exécuté sur le même thread.
Cependant, il y a aucune garantie que le contexte du thread de l'information est conservée? Je veux dire Name
, CurrentPrincipal
, CurrentCulture
, CurrentUICulture
, etc. Cela dépend-il de cadre (ASP.NET, WinForms, WCF, WPF)?
- En général,
SynchronizationContext
ne garantit pas que la suite sera exécuté sur le même thread. Certains contextes pour que (WPF, Winforms), mais d'autres ne le font pas (ASP.NET). - Vous pouvez définir une valeur par défaut de la culture pour les threads comme ceci.
Vous devez vous connecter pour publier un commentaire.
Bien,
async
/await
est une réécriture qui utilise CPS, afin de base de votre compréhension est correcte.Sujet de la "simultanéité" et de "parallélisme", je dirais qu'il n'permettre la simultanéité; vous pouvez démarrer plusieurs
async
opérations qui sont tous "en vol" en même temps. C'est facile à faire avecTask.WhenAll
etTask.WhenAny
.Aussi, même si
async
par lui-même ne signifie pas "multithreading",Task.Run
ne facilitentasync
-compatible multithreadingPensez-y de cette façon: la poursuite créé par le CPS de réécriture a pour exécuter quelque part. La capture d'async "contexte" peut être utilisé pour planifier la suite.
Note de côté: la capture de contexte est en fait
SynchronizationContext.Current
, sauf si elle est nulle, auquel cas la capture d'contexte estTaskScheduler.Current
.Une autre remarque importante: la capture et de restauration du contexte est en fait à la "awaiter" objet. Donc, par défaut, si vous
await
unTask
(ou tout autre intégré awaitable), le contexte sera capturé et restauré. Mais si vousawait
le résultat deConfigureAwait(false)
, le contexte n'est pas capturé. De même, si vousawait
votre propre awaitable, il ne sera pas capturer le contexte (sauf si vous le programmer).SynchronizationContext
est différent de celuiExecutionContext
. Simplifié réponse est queExecutionContext
toujours des "flux", de sorteCurrentPrincipal
flux (si elle n'a pas, il pourrait être un problème de sécurité, c'est pourquoi les Api qui ne coulent pasExecutionContext
toujours fin dansUnsafe
).Dans les applications d'INTERFACE utilisateur, la culture n'est pas le débit, mais par défaut, c'est la même chose pour tous les threads de toute façon.
Name
est certainement pas aller à l'écoulement, à moins que vous reprendre sur le même fil (p. ex., à l'aide d'une INTERFACE utilisateurSynchronizationContext
).Pour certains plus de la lecture, je vous recommande de commencer avec mon propre
async
/attendre
tutoriel et puis le officielasync
/attendre
FAQ. Alors jetez un oeil à Stephen Toub le billet de blog deExecutionContext
au lieu deSynchronizationContext
.Vous pouvez également trouver mon
SynchronizationContext
article utile.Non, le
async
/await
mots-clés ont tout à voir avec la concurrence.async
/await
sont essentiellement constituées de votre code de la méthode à une tâche et la poursuite. Pour voir la traduction exacte que le compilateur produit (à l'aide de la Task Parallel Library) de démonter certains extrait de code. Cette traduction deasync
/await
utilisation est "similaire" (mais pas identiques!) pour l'exemple ci-dessousc'est approxiamtely converti à
où vous attendez le retour à l'extérieur de la méthode comme
Ou, vous pouvez placer le code TPL dans le
Result
méthodeSynchronizationContext
ne garantit pas que la suite sera exécuté sur le même thread pour leasync
/awate
code. Toutefois, vous pouvez définir le contexte à l'aide de TPL code, via leSynchronisationContex
mot-clé.