21

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

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

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

然而,大多数评论(在帖子下方)不同意 Scott 所写的观点,称请求始终在一个线程中运行,并且该线程不会同时被另一个请求使用。这也是我所相信的,但很想在这里对你们的专家发表一些意见。

4

2 回答 2

32

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

您可能希望阅读此博客文章此 Spring 论坛主题以了解更多详细信息。

基本上你应该找到一种不同的方式来捕捉上下文。从您的角度来看,相关位可能在博客文章的末尾:

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

于 2011-01-25T08:19:40.733 回答
1

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

于 2011-01-25T09:35:18.187 回答