2010-02-10 31 views
4

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

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

回答

4

HttpContext及其所有属性是不是线程安全,所以你应该非常小心。从不同线程同时读取数据不会造成任何影响,但是您必须确保没有写操作发生。尽管如此,即使你确定Items属性没有改变,我仍然希望创建一个副本并将其提供给后台线程。这明确传达了意图,并且避免了在代码评论期间进行讨论,或者人们重新评估此代码是否确实是线程安全的。

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

相关问题