如何获取另一个线程的ThreadStatic值?

Pom*_*oma 6 .net c# multithreading

是否有可能给定Thread参考来获取ThreadStatic该线程的值?

Han*_*ant 6

不,那不可能。与此类属性一样,该[ThreadStatic]属性是通过抖动来识别的。它生成对 CLR 的调用,以获取指向类的线程本地存储的指针。该辅助方法有多个版本,最基本的版本是JIT_GetSharedGCThreadStaticBase(). 但对于泛型类来说,它变得更加复杂,例如,它可以根据类型参数拥有多个静态变量。辅助函数采用两个不明显的参数:模块 ID 和类 ID。这些 ID 取决于加载代码的 AppDomain。

长话短说,您没有机会进行相同的调用,辅助方法甚至也没有获取线程 ID,它是由调用上下文暗示的。

您可以使用 挂起线程中的任意数据Thread.AllocateNamedDataSlot()。但请注意,它是静态方法,也不采用线程 ID,它同样基于调用上下文。

这都是有意而为之的。线程本地存储的一个非常好的属性是它始终是线程安全的。允许从另一个线程访问它的后门将完全破坏该功能。如果你想这样做,你应该非常担心一些事情。例如,您可以使用自己的以 ManagedThreadId 为键的查找表。