我正在阅读Walkthrough: Creating an Asynchronous HTTP Handler并注意到它们从处理程序线程传递HttpContext
并在后台线程上运行的WaitCallback
中使用它。它会调用_context.Response.Write()
。我是否正确假设这不违反HttpContext不是线程安全的事实,因为处理程序线程在异步工作开始后不会使用它?
此外,Using an HTTPContext across threads有一些关于HttpContext和线程的好信息。所有HttpContext都不是线程安全的,还是像Response
这样的项目?如果仅在读取模式下,多个后台线程可以访问Items
属性吗?
答案 0 :(得分:5)
HttpContext
及其所有属性不线程安全,因此您应该非常小心。从不同的线程同时读取数据不会有任何损害,但您必须确保没有发生写入操作。尽管如此,即使你确定Items
属性没有改变,我也希望复制并将其提供给后台线程。这清楚地传达了意图,使您免于在代码审查期间进行讨论,或者重新评估此代码是否真的是线程安全的。
现在关于在异步请求中使用HttpContext
;从不同的线程访问HttpContext
将是危险的,但在这种情况下,ASP.NET控制线程并确保只有一个线程正在处理请求。例如,当您继续执行时,手动(通过使用线程池或new Thread()
)and supplying HttpContext
向该线程启动新线程时会有所不同。