我发现了“ThreadStaticAttribute”,我对此有很多疑问:我之前所有依赖线程的静态信息都是作为静态字典实现的,TKey就是线程,当我想访问它时,我使用了Thread.CurrentThread,这是可行的。但是这需要维护,因为如果一个线程死了,我必须从字典中删除相应的条目。我还需要考虑线程安全性,以及许多其他问题。
通过使用ThreadStaticAttribute,所有这些问题似乎都得到了解决,但我需要确保这一点。我的问题是:我需要在线程死之前,以某种方式删除由'ThreadStaticAttribute‘标记的字段持有的实例吗?该字段的信息在哪里??它在Thread对象的实例中,或者类似的东西中,所以当它不再使用时,垃圾收集器会自动丢弃它吗?是否存在性能损失?哪几个?它是否比像我这样使用键控集合更快?
我需要澄清一下'ThreadStaticAttribute‘是如何工作的。
谢谢。
发布于 2010-01-16 05:24:15
不,您不需要删除用ThreadStatic
标记的字段中的值help的实例。当根对象不再能够访问线程和对象时,垃圾收集器将自动拾取它们。
这里唯一的例外是,如果值实现了IDisposable
,并且您想要主动处理它。一般来说,这是一个很难解决的问题,原因有很多。没有在ThreadStatic
字段中实现IDisposable
的值要简单得多。
至于这个字段的实际存储位置,它多少有点无关紧要。您需要关心的是,它的行为与.Net中的任何其他对象一样。唯一的两个行为差异是
发布于 2010-01-16 05:33:32
将静态成员变量标记为ThreadStatic会告诉编译器将其分配到线程的内存区中(例如:其中分配线程的堆栈),而不是在全局存储区中。因此,每个线程都有自己的副本(保证被初始化为该类型的默认值,例如:null、0、false等;不要使用内联初始化器,因为它们只会为一个线程初始化它)。
因此,当线程离开时,它的内存区也会离开,从而释放引用。当然,如果它需要更直接的处理(打开文件流等),而不是等待后台垃圾回收,您可能希望确保在线程退出之前执行此操作。
可用的ThreadStatic空间量可能是有限制的,但对于正常使用来说应该足够了。它应该比访问键控集合(更容易实现线程安全)要快一些,我认为它可以与访问普通静态变量相媲美。
更正:我后来听说访问ThreadStatic变量比访问普通静态变量要慢一些。我不确定它是否真的比访问键控集合更快,但它确实避免了孤立(这是您的问题)和需要锁定线程安全性的问题,这会使键控集合方法变得复杂。
https://stackoverflow.com/questions/2074882
复制相似问题