5

我正在阅读演练:创建异步 HTTP 处理程序并注意到它们从处理程序线程传递并在后台线程上运行的 a 中HttpContext使用它。WaitCallback它会像_context.Response.Write(). 我是否正确假设这不违反 HttpContext 不是线程安全的事实,因为在异步工作开始后处理程序线程将不会使用它?

此外,跨线程使用 HTTPContext有一些关于 HttpContext 和线程的好信息。是所有 HttpContext 都不是线程安全的,还是只是类似的项目ResponseItems如果仅在读取模式下,多个后台线程可以访问该属性吗?

4

1 回答 1

5

和它的HttpContext所有属性都不是线程安全的,所以你应该非常小心。从不同线程同时读取数据不会有任何危害,但您必须确保没有发生写入操作。尽管如此,即使您确定Items属性没有更改,我还是更愿意制作一个副本并将其提供给后台线程。这清楚地传达了意图,并使您免于在代码审查期间进行讨论或人们重新评估此代码是否真的是线程安全的。

现在关于HttpContext在异步请求中使用;从不同的线程访问HttpContext是危险的,但在这种情况下,ASP.NET 控制线程并确保只有一个线程在处理请求。new Thread()例如,当您手动(通过使用线程池或)启动一个新线程and supplying HttpContext到该线程,同时继续执行时,情况会有所不同。

于 2010-02-24T09:44:41.093 回答