Question

En essayant d'utiliser le nouveau modèle asynchrone C# 5, cela m'a surpris AspNetSynchronizationContext est une classe interne (ainsi que AspNetSynchronizationContextBase base).Donc sans papiers.Mais il est essentiel de savoir ce qu'il fait lors de l'utilisation de la fonctionnalité async/wait dans votre code ASP.NET.Ai-je raison de dire que Il fait garantissez que vos continuations seront les mêmes HttpContext.Current en tant qu'appelants d'origine ?Il ne fait pas garantir que les continuations s'exécuteront sur le même thread que les appelants ?

Si cette dernière hypothèse n'est pas vraie et que j'obtiens le fil de discussion d'origine, puis-je être sûr d'obtenir le même contexte de fil de discussion dans les suites ?Je veux dire le principal/la culture associée au thread et au stockage local du thread ?C'est important car la localisation ASP.NET repose sur la culture du thread et mon application s'appuie sur le modèle de sécurité de rôle .NET (principal du thread).

Était-ce utile?

La solution

Ai-je raison de dire que cela garantit que vos continuations recevront le même HttpContext.Current que les appelants d'origine ?Cela ne garantit-il pas que les continuations s'exécuteront sur le même thread que les appelants ?

Oui, HttpContext.Current est préservé, et oui, les continuations peuvent s'exécuter sur un thread différent.

Je veux dire le principal/la culture associée au thread et au stockage local du thread ?C'est important car la localisation ASP.NET repose sur la culture du thread et mon application s'appuie sur le modèle de sécurité de rôle .NET (principal du thread).

Le stockage local du thread ordinaire est perdu.Vous pouvez atténuer cela en utilisant LogicalCallContext (qui coule avec ExecutionContext), mais avec async il est plus facile de référencer directement les variables.

Le principal est toujours préservé ;faire autrement constituerait un risque pour la sécurité.Cela coule avec ExecutionContext.

Je crois que la culture coule avec AspNetSynchronizationContext, mais je n'ai pas testé ça sur La nouvelle implémentation de .NET 4.5.


Vous trouverez peut-être mon Article MSDN sur SynchronizationContext utile.Ce n'est pas une documentation officielle (je ne travaille pas pour Microsoft), mais au moins c'est quelque chose.Notez que le AspNetSynchronizationContext référencé dans cet article s'appelle désormais LegacyAspNetSynchronizationContext dans .NET 4.5.

Une autre excellente ressource est celle de Stephen Toub ExecutionContext contre. SynchronizationContext.

Autres conseils

Eh bien, même si la capture du ExecutionContext est toujours garantie, la capture et l'exécution de l'exécution sur le même SynchronizationContext dépendent de l'Awaiter.

L'attente la plus courante (le type renvoyé par la méthode GetAwaiter() qui est appelée en interne lorsque vous "attendez" quelque chose) est TaskAwaiter renvoyé par Task.GetAwaiter().Par défaut, TaskAwaiter capturera le SynchronizationContext actuel et exécutera le délégué de continuation sur le SynchronizationContext capturé.Ce qui signifie que vous pourrez utiliser HttpContext.Current dans le reste de votre méthode, et cela ne vous dérange pas qu'elle s'exécute comme une continuation.Ainsi, ce code fonctionnera comme prévu (la partie où vous écrivez "B" s'exécutera sur le même contexte de synchronisation que la première ligne) :

HttpContext.Current.Response.Write("A");
await Task.Delay(1000);
HttpContext.Current.Response.Write("B")

Vous pouvez modifier ce comportement en utilisant Task.ConfigureAwait(false) méthode, qui indique à l'attenteur de ne pas rassembler le reste de la méthode vers le SynchronizationContext d'origine.

Bien sûr, si vous utilisez Task.Run ou Task.Factory.StartNew dans la méthode asynchrone que vous appelez, il est de votre responsabilité de capturer à nouveau le SynchronizationContext.

Bonne chance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top