异步HTTP处理程序和后台线程中使用HttpContext?

时间:2010-02-10 13:40:39

标签: asp.net multithreading thread-safety httpcontext

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

此外,Using an HTTPContext across threads有一些关于HttpContext和线程的好信息。所有HttpContext都不是线程安全的,还是像Response这样的项目?如果仅在读取模式下,多个后台线程可以访问Items属性吗?

1 个答案:

答案 0 :(得分:5)

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

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