Trying to use new C# 5 async model it was surprising to me AspNetSynchronizationContext is an internal class (as well as AspNetSynchronizationContextBase base). Thus undocumented. But it’s essential to know what it does when utilizing async/await feature within your ASP.NET code. Am I correct that
It does guarantee your continuations will get the same HttpContext.Current as original callers?
It does not guarantee the continuations will execute on the same thread as the callers?
If the latter assumption is not true and I get the original thread can I be sure to get the same thread context in continuations? I mean principal/culture associated with the thread and thread local storage? That’s important because ASP.NET localization relies on thread’s culture and my application relies on .NET role security model (thread’s principal).
Yes,
HttpContext.Currentis preserved, and yes, the continuations may execute on a different thread.Ordinary thread-local storage is lost. You can mitigate this by using
LogicalCallContext(which flows withExecutionContext), but withasyncit’s easier to just reference the variables directly.Principal is always preserved; to do otherwise would be a security risk. This flows with
ExecutionContext.I believe that culture flows with
AspNetSynchronizationContext, but I haven’t tested this out on .NET 4.5’s new implementation.You may find my MSDN article on
SynchronizationContexthelpful. It’s not official documentation (I don’t work for Microsoft), but at least it’s something. Note that theAspNetSynchronizationContextreferenced in that article is now calledLegacyAspNetSynchronizationContextin .NET 4.5.Another great resource is Stephen Toub’s
ExecutionContextvs.SynchronizationContext.