HttpContext的线程安全性

Mar*_*cus 5 .net c# asp.net multithreading httpcontext

经过一段时间的谷歌搜索后,我还没有找到任何关于HttpContext的线程安全性的权威,确凿的信息.

我正在看一个场景,例如:

public class AsyncHandler : IAsyncHttpHandler 
{
   void BeginProcessRequest(...)
   {
      // Spawn some tasks in parallel, provide them with current HttpContext as argument.
   }

   void EndProcessRequest(...) {...}
}
Run Code Online (Sandbox Code Playgroud)

My(io bound)并行任务可能希望同时访问HttpContext.

看看各个帖子似乎这是安全的,但是,我想要一些实际的证据.当然MSDN给出了通常的"静态线程安全等",但除了我必须假设它不是线程安全之外,这没有任何帮助.

我在StackOverflow上看过各种帖子(比如这里,或者这里,或者这里),但这个问题没有真正的答案.

使用.NET 4.5中的所有异步工作,如果HttpContext不是线程安全的话,这似乎有点奇怪,但是,如果确实不是这样,有没有办法让它成功呢?我能想到:

  • 克隆它(但这不是那么容易,虽然乍一看似乎不太可能).
  • 包装HttpContextBase并使这个线程安全(嘿,我称之为HttpContextWrapperWrapper).

但这一切都感觉有点糟糕和太多的工作.

编辑:在更详细地研究这个,以及稍后的一些反思后,我相信它实际上并不重要HttpContext不是线程安全的.我在这篇博文中详述了这一点.要点是在ASP.NET中使用正确的SynchronizationContext可确保一次只能有一个线程访问上下文.

Joe*_*Joe 8

HttpContext类不是线程安全的.

例如,该HttpContext.Items属性只是对非同步Hashtable的引用 - 因此这显然不是线程安全的.

从你的问题中不清楚你想要在并行任务之间分享什么,但我建议你使用你自己的线程安全类的实例来共享任务之间的状态,而不是试图包装现有的类.