som*_*ere 5 asp.net .net-core asp.net-core
有两种通过以下方式访问用户HttpContext的常规方法:
httpContextAccessor.HttpContext
this.HttpContext
在我的代码库中,我们同时使用了两种情况。对于的使用HttpContextAccessor
,我们主要将它们用于每个请求(例如日志记录,会话处理等)共享的通用单例服务中。我认为这应该是线程安全的,HttpContextAccessor
应该知道如何处理它,但是我看到此推文使我失望:https : //twitter.com/davidfowl/status/907248318538903553
到目前为止,它看起来还不错,但是是否可以确认它是线程安全的呢?
您混淆了两个不同的概念。线程安全性与 HTTP 请求无关,因为 HTTP 请求需要使用线程。不过,差不多就是这样了。HttpContext 是请求范围的,因此在单个请求的上下文中,假设您仅停留在一个线程上或所有操作线程都在该特定请求的上下文中运行,则不会出现溢出。
当您开始启动在后台运行的线程(即在请求管道之外)时,事情就会变得不稳定。在这种情况下,HttpContext 可能存在也可能不存在,或者后台线程的 HttpContext 可能与原始线程不同。这就是线程不安全的根源。
总而言之,HttpContext
线程是否安全是一个错误的问题。相反,您需要询问线程在什么上下文中正在执行什么工作。如果您位于请求管道中,那么HttpContext
实际上将是线程安全的,但这将需要捕获您触发的所有线程,这几乎否定了使用多个线程的有用性。您不妨只在原始线程上完成所有工作。处理网络请求与处理桌面或移动应用程序不同。在后者中,您需要保持主线程或 UI 线程空闲,因此必须分拆线程。网络不是这样运作的;所有线程都是瞬态的,为特定请求提供服务,然后返回到池中。
归档时间: |
|
查看次数: |
476 次 |
最近记录: |