今天发现了这个很酷的东西,可以用来标记静态字段。就我的理解,被标记为ThreadStaticAttribute的静态字段的语义将会变化,从一个正常的内存地址变成TLS中的一个存储位置。就当它做访问TLS的一种快捷方式。不同的ThreadStatic静态字段并不会冲突,表示TLS中独立的存储位置。
网上的一篇文章说到了在Asp.net中使用ThreadStatic的一些问题。我不太确定我的理解是否正确,但看起来好象是说,由于asp.net复用托管线程(线程池)来服务请求,因此在对先后发生的多个请求服务时有可能使用的是同一个线程。而TLS不会因为服务新的请求而重置。因此如果ThreadStatic静态字段中保存的信息如果同请求相关,那么后来的请求就会看到前面请求留下来的信息。
有一篇文章还比较了ThreadStatic和CallContext类的静态方法。上面提到CallContext中的数据会传递到从本线程创建的子线程或异步线程中去。(这一点在MSDN中没有提到,所以值得怀疑。但是上面又说HttpContext.Current是通过这个实现的;考虑到HttpContext的行为,感觉人家说的应该是对的。矛盾。)不知道这里说的“传递”是指仅仅把CallContext中的数据复制一份过去还是把CallContext中的数据序列化再反序列化给子线程。我觉得应该是前者。有时间需要测试一下。
妈的现在时间太少了很多东西都只能先靠猜了。
还发现了(instance) HttpContext.Items这个集合。就像其名称所暗示的那样,存储在其中的数据仅仅是用于当前Http请求,这个集合会在每次创建新的HttpContext实例时重新初始化。
By the way, System命名空间下还有一个ContextStaticAttribute,其中的“Context”是指Remoting中的Context,ContextBoundObject中的Context。是应用程序域下面的结构。