HttpContext is not designed to be thread-safe, which means you can run into nasty things if you share a
HttpContext between thread. For example, this is one of the things that can happen: One (or more) thread is stuck in this:
mscorlib_ni!System.Collections.Generic.Dictionary`2[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].FindEntry(System.__Canon)+ed
EPiServer.Core.Internal.ProjectPipeline.Pipe(EPiServer.Core.ContentReference, System.Globalization.CultureInfo, EPiServer.Core.LoaderOptions)+1c
EPiServer.Core.Internal.ProviderPipelineImplementation.GetItem(EPiServer.Core.ContentProvider, EPiServer.Core.ContentReference, EPiServer.Core.LoaderOptions)+109
EPiServer.Core.Internal.DefaultContentLoader.TryGet[[System.__Canon, mscorlib]](EPiServer.Core.ContentReference, EPiServer.Core.LoaderOptions, System.__Canon ByRef)+11e
EPiServer.Core.Internal.DefaultContentLoader.Get[[System.__Canon, mscorlib]](EPiServer.Core.ContentReference, EPiServer.Core.LoaderOptions)+63
If you don’t know why this is scary, this is any infinite loop, meaning your CPU will be spent 100% in to this
Dictionary.FindEntry, unable to do anything else. The only way to solve this problem is to restart the instance.
That is caused by unsafe accessing of a
Dictionary – if you have a thread that is enumerating it, and another thread trying to write to it, it is possible to run into a dead end like this.
HttpContext just happens to have many
Dictionary properties and sub-properties.
HttpContext.Request.RequestContext.RouteData.DataTokens is one of them (And a reason the code above ended in a disaster), making it vulnerable for this kind of problem. Which is exactly why it is not recommended to share a
HttpContext between threads.
Sometimes, you can just set
HttpContext.Current to null. Sometimes, you need to take a step back and ask yourself that do you really need to run things in parallel?