【发布时间】:2011-07-10 19:19:15
【问题描述】:
[ThreadStatic] 属性如何工作?我假设编译器会发出一些 IL 来填充/检索 TLS 中的值,但是查看反汇编时它似乎并没有在那个级别上做到这一点。
作为后续,如果你把它放在一个非静态成员上会发生什么?我们让开发人员犯了这个错误,编译器甚至没有提供警告。
更新
第二个问题在这里回答:ThreadStatic Modified with Static C#
【问题讨论】:
-
如果生成的 IL 相同(确实如此),则必须专门对运行时进行编码,以了解如何在遇到此类修饰字段时分配和读取值。看起来像一个黑客:)
-
请注意,如果 ThreadStatic 与线程池线程一起使用,则该值 可能 仍会在下次重新使用该池线程时设置(除非操作系统保证它在重新使用池线程时重新初始化线程本地存储)。为了安全起见,在开始使用池线程时,将所有 ThreadStatics 初始化为所需的状态。为了让这更容易,将 ThreadStatics 收集到 MyContext 类中,因此只有 一个 静态重新初始化:
public class SomeClass { public static MyContext myContext; ...现在在获取池线程后立即执行SomeClass.myContext = new MyContext();
标签: c# static threadstatic