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

Kev*_*son 5 asp.net multithreading httpcontext thread-safety

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

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

Ste*_*ven 5

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

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