C# ASP.NET中的ThreadStaticAttribute

C# ASP.NET中的ThreadStaticAttribute,c#,.net,asp.net,multithreading,threadstatic,C#,.net,Asp.net,Multithreading,Threadstatic,我有一个组件需要为每个线程存储静态值。它是一个通用组件,可以在许多场景中使用,而不仅仅是在ASP.NET中 我正在考虑使用[ThreadStatic]属性来实现我的目标。假设它在ASP.NET场景中也可以正常工作,因为我假设每个请求都在自己的线程中调用 经过一些研究,我发现Scott Hanselman说在ASP.NET中使用[ThreadStatic]时要小心 然而,大多数评论(在帖子下面)都不同意Scott所写的,他说一个请求总是在一个线程中运行,而另一个请求不会同时使用该线程。这也是我所相

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

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

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


然而,大多数评论(在帖子下面)都不同意Scott所写的,他说一个请求总是在一个线程中运行,而另一个请求不会同时使用该线程。这也是我所相信的,但我很想对在座的各位专家有一些看法

不,Scott是对的:请求在整个过程中不必在单个线程上运行。ASP.NET在这方面是线程敏捷的。只有少数几点是可以改变的,但它肯定会发生。(我已经亲自测试过了。)

您可能希望阅读和了解更多详细信息

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

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


我不确定是否在ASP.NET环境中使用线程本地数据,但.NET 4.0随类提供。

谢谢您的提示。我不知道那门课。然而,由于Jon提到的相同原因,它也可能不起作用,我想?在本文中,ASP.NET是如何处理线程主体的?如果我在
global.asax
中设置principal on site access,并在线程可以更改的上下文中使用此principal来检查声明等,Asp.net是否复制principal或线程文化?@T.S:是的,我相信会-但我不是Asp.net专家,所以我不知道细节。你知道这对WebService(asmx)请求是否也是正确的吗?@Mt.Schneiders:我希望是正确的,但我不确定。当然,如果你在ASPNET中使用async,[ThreadStatic]更可能导致问题-