ASP.NET中的ThreadStaticAttribute

时间:2011-01-25 08:16:19

标签: c# .net asp.net multithreading threadstatic

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

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

经过一些研究后,我发现Scott Hanselman this Blog Post说在ASP.NET中使用[ThreadStatic]时要小心。

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

2 个答案:

答案 0 :(得分:30)

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

您可能希望阅读this blog postthis Spring forum thread了解更多详情。

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

  

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

答案 1 :(得分:1)

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