HttpContext的线程安全性

时间:2012-11-17 17:11:33

标签: c# asp.net .net multithreading httpcontext

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

我正在考虑如下情况:

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

   void EndProcessRequest(...) {...}
}

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

环顾各种帖子似乎这是安全的,但是,我想要一些实际的证据。当然MSDN给出了通常的“静态线程安全等”,但这并没有帮助,除了我必须假设它不是线程安全的。

我在StackOverflow上看过各种帖子(例如hereherehere),但这个问题没有真正的答案。

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

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

但这一切都让人觉得有点蹩脚和太多工作。

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

1 个答案:

答案 0 :(得分:8)

HttpContext类不是线程安全的。

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

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