C# ThreadStaticAttribute 标记的字段在线程死亡时自动释放?

标签 c# multithreading static

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

通过使用ThreadStaticAttribute,所有这些问题似乎都解决了,但我需要确定一下。我的问题是:我是否需要在线程死亡之前以某种方式删除由 ThreadStaticAttribute 标记的字段持有的实例?该领域的信息保存在哪里?它在 Thread 对象的实例中,或者类似的东西,以便当它不再被使用时,垃圾收集器会自动丢弃它?有性能惩罚吗?什么?它比像我一样使用 Keyed 集合更快吗?

我需要说明 ThreadStaticAttribute 的工作原理。

最佳答案

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

这里唯一的异常(exception)是如果该值实现了 IDisposable 并且您想要主动处置它。一般来说,由于多种原因,这是一个很难解决的问题。没有实现 IDisposable 并且位于 ThreadStatic 字段中的值要简单得多。

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

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

关于C# ThreadStaticAttribute 标记的字段在线程死亡时自动释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2074882/

相关文章:

c# - C# 中的全局化

java - Java中如何让ThreadPoolExecutor立即执行

java - 如何在多线程环境下高效使用 RestTemplate?

objective-c - 拥有应用程序范围阵列的最佳方式?

c# - 当用户在 richtextbox 中输入大量数据时显示阅读更多选项

c# - 检索CRM 4 C#中的自定义实体

c# - DataContext 改变时立即更新 Binding

multithreading - Play Framework Scala 线程亲和性

java - 应用程序容器中的守护线程

c - fork子进程中的静态变量