我发现了 ThreadStaticAttribute
,对此我有很多疑问:
我以前所有依赖于线程的静态信息都是作为一个静态字典实现的,其中 TKey 是 Thread,当我想访问它时,我使用了 Thread.CurrentThread 并且它有效。但这需要维护,因为如果一个线程死了,我必须从字典中删除相应的条目。而且我还需要考虑线程安全和许多其他问题。
通过使用ThreadStaticAttribute
,所有这些问题似乎都解决了,但我需要确定一下。我的问题是:我是否需要在线程死亡之前以某种方式删除由 ThreadStaticAttribute
标记的字段持有的实例?该领域的信息保存在哪里?它在 Thread
对象的实例中,或者类似的东西,以便当它不再被使用时,垃圾收集器会自动丢弃它?有性能惩罚吗?什么?它比像我一样使用 Keyed 集合更快吗?
我需要说明 ThreadStaticAttribute
的工作原理。
最佳答案
不,您不需要删除标记有 ThreadStatic
的字段中的值帮助实例。当根对象不再可以访问线程和对象时,垃圾收集器将自动拾取它们。
这里唯一的异常(exception)是如果该值实现了 IDisposable
并且您想要主动处置它。一般来说,由于多种原因,这是一个很难解决的问题。没有实现 IDisposable
并且位于 ThreadStatic
字段中的值要简单得多。
至于这个字段实际存储在哪里,有点无关紧要。您需要关心的只是它的行为与 .Net 中的任何其他对象一样。仅有的两个行为差异是
- 该字段将引用每个访问线程的不同值。
- 该字段的初始化器只会运行一次(实际上,运行任何一个都不是一个好主意)。
关于C# ThreadStaticAttribute 标记的字段在线程死亡时自动释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2074882/