我有一个组件需要在每个线程之前存储static
个值。它是一个通用组件,可以在许多场景中使用,而不仅仅在ASP.NET中使用。
我正在考虑使用[ThreadStatic]
属性来实现我的目标。假设它在ASP.NET场景中也能正常工作,因为我假设每个Request都是在自己的线程中调用的。
经过一些研究后,我发现Scott Hanselman this Blog Post说在ASP.NET中使用[ThreadStatic]
时要小心。
然而,大多数评论(在帖子下面)都不同意斯科特写的,说请求总是在一个线程中运行,并且该线程不会被另一个请求同时使用。这也是我所相信的,但我很乐意在这里对你的专家有一些看法。
答案 0 :(得分:30)
不,Scott是对的:肯定不的请求必须在整个持续时间内在单个线程上运行。在这方面,ASP.NET是线程敏捷。交换机只有几个点可以发生,但肯定会发生 。 (我已经为自己测试了。)
您可能希望阅读this blog post和this Spring forum thread了解更多详情。
基本上你应该找到一种捕捉上下文的不同方法。您的观点中的相关位置可能在博客文章的末尾:
这是一个主要的PITA,因为据我所知,这意味着ASP.Net中'ThreadStatic'行为的唯一持久性选项是使用HttpContext。因此,对于您的业务对象,您要么遇到if(HttpContext.Current!= null)和System.Web引用(yuck),要么您必须为静态持久性提供某种提供者模型,这将需要在访问任何这些单例之前进行设置。双翘。
答案 1 :(得分:1)
我不确定在ASP.NET环境中使用线程本地数据,但.NET 4.0附带ThreadLocal类。