ASP.NET中的ThreadStaticAttribute

我有一个组件需要在每个线程之前存储static值。 它是一个通用组件,可以在许多场景中使用,而不仅仅在ASP.NET中使用。

我正在考虑使用[ThreadStatic]属性来实现我的目标。 假设它在ASP.NET场景中也能正常工作,因为我假设每个Request都在自己的线程中调用。

经过一些研究后,我发现Scott Hanselman 撰写的这篇博客文章说在ASP.NET中使用[ThreadStatic]时要小心。

然而,大多数评论(在post下面)都不同意斯科特写的,说请求总是在一个线程中运行,并且该线程不会被另一个请求同时使用。 这也是我所相信的,但我很乐意在这里对你的专家有一些看法。

不,Scott是对的:一个请求绝对不必在整个持续时间内在单个线程上运行。 在这方面,ASP.NET是线程敏捷的 。 切换可能发生的只有几个点,但肯定发生。 (我已经为自己测试了。)

您可能希望阅读此博客文章和本春季论坛post以获取更多详细信息。

基本上你应该找到一种不同的捕获上下文的方法。 您的观点中的相关位可能在博客文章的末尾:

这是一个主要的PITA,因为据我所知,这意味着ASP.Net中’ThreadStatic’主题行为的唯一持久性选项是使用HttpContext。 因此,对于您的业务对象,您要么坚持使用if(HttpContext.Current!= null)和System.Web引用(yuck),要么您必须为静态持久性提供某种提供者模型,这将需要在访问任何这些单例之前进行设置。 双翘。

我不确定在ASP.NET环境中使用线程本地数据,但.NET 4.0附带了ThreadLocal类。