首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否在线程终止时自动释放C# ThreadStaticAttribute标记的字段?

是否在线程终止时自动释放C# ThreadStaticAttribute标记的字段?
EN

Stack Overflow用户
提问于 2010-01-16 05:21:33
回答 2查看 4K关注 0票数 19

我发现了“ThreadStaticAttribute”,我对此有很多疑问:我之前所有依赖线程的静态信息都是作为静态字典实现的,TKey就是线程,当我想访问它时,我使用了Thread.CurrentThread,这是可行的。但是这需要维护,因为如果一个线程死了,我必须从字典中删除相应的条目。我还需要考虑线程安全性,以及许多其他问题。

通过使用ThreadStaticAttribute,所有这些问题似乎都得到了解决,但我需要确保这一点。我的问题是:我需要在线程死之前,以某种方式删除由'ThreadStaticAttribute‘标记的字段持有的实例吗?该字段的信息在哪里??它在Thread对象的实例中,或者类似的东西中,所以当它不再使用时,垃圾收集器会自动丢弃它吗?是否存在性能损失?哪几个?它是否比像我这样使用键控集合更快?

我需要澄清一下'ThreadStaticAttribute‘是如何工作的。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-16 05:24:15

不,您不需要删除用ThreadStatic标记的字段中的值help的实例。当根对象不再能够访问线程和对象时,垃圾收集器将自动拾取它们。

这里唯一的例外是,如果值实现了IDisposable,并且您想要主动处理它。一般来说,这是一个很难解决的问题,原因有很多。没有在ThreadStatic字段中实现IDisposable的值要简单得多。

至于这个字段的实际存储位置,它多少有点无关紧要。您需要关心的是,它的行为与.Net中的任何其他对象一样。唯一的两个行为差异是

  1. 对于每个访问线程,该字段将引用不同的值。
  2. 字段的初始化器将只运行一次(实际上,使用任何初始化器都不是一个好主意)。
票数 15
EN

Stack Overflow用户

发布于 2010-01-16 05:33:32

将静态成员变量标记为ThreadStatic会告诉编译器将其分配到线程的内存区中(例如:其中分配线程的堆栈),而不是在全局存储区中。因此,每个线程都有自己的副本(保证被初始化为该类型的默认值,例如:null、0、false等;不要使用内联初始化器,因为它们只会为一个线程初始化它)。

因此,当线程离开时,它的内存区也会离开,从而释放引用。当然,如果它需要更直接的处理(打开文件流等),而不是等待后台垃圾回收,您可能希望确保在线程退出之前执行此操作。

可用的ThreadStatic空间量可能是有限制的,但对于正常使用来说应该足够了。它应该比访问键控集合(更容易实现线程安全)要快一些,我认为它可以与访问普通静态变量相媲美。

更正:我后来听说访问ThreadStatic变量比访问普通静态变量要慢一些。我不确定它是否真的比访问键控集合更快,但它确实避免了孤立(这是您的问题)和需要锁定线程安全性的问题,这会使键控集合方法变得复杂。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2074882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档