5

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

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

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

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

我的(io 绑定)并行任务可能希望同时访问 HttpContext。

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

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

对于 .NET 4.5 中的所有异步工作,如果 HttpContext 不是线程安全的,这似乎有点奇怪,但是,如果确实不是这样,有什么方法可以做到吗?我能想到:

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

但这一切都让人感觉有点蹩脚而且工作量太大。

编辑:在更详细地研究了这一点,并在稍后进行了一些反思之后,我相信 HttpContext 不是线程安全的实际上并不重要。我在这篇博文中详细说明了这一点。要点是在 ASP.NET 中使用正确的 SynchronizationContext 可确保一次访问上下文的线程不超过一个。

4

1 回答 1

8

HttpContext 类不是线程安全的。

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

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

于 2012-11-17T18:45:21.257 回答