经过一番谷歌搜索后,我没有找到任何关于 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 上看到过各种帖子(例如here或here或here),但对这个问题没有真正的答案。
对于 .NET 4.5 中的所有异步工作,如果 HttpContext 不是线程安全的,这似乎有点奇怪,但是,如果确实不是这样,有什么方法可以做到吗?我能想到:
- 克隆它(但这并不容易,尽管乍一看似乎并非不可能)。
- 包装 HttpContextBase 并使这个线程安全(嘿,我称之为 HttpContextWrapperWrapper)。
但这一切都让人感觉有点蹩脚而且工作量太大。
编辑:在更详细地研究了这一点,并在稍后进行了一些反思之后,我相信 HttpContext 不是线程安全的实际上并不重要。我在这篇博文中详细说明了这一点。要点是在 ASP.NET 中使用正确的 SynchronizationContext 可确保一次访问上下文的线程不超过一个。