Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取另一个线程的ThreadStatic值?_C#_.net_Multithreading - Fatal编程技术网

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

C# 如何获取另一个线程的ThreadStatic值?,c#,.net,multithreading,C#,.net,Multithreading,给定Thread引用,是否可以获取该线程的ThreadStatic值?否,这是不可能的。与此属性一样,抖动可以识别[ThreadStatic]属性。它生成对CLR的调用,以获取指向类的线程本地存储的指针。此帮助器方法有多个版本,基本版本是JIT_GetSharedGCThreadStaticBase()。但是对于泛型类来说,它变得更加复杂。例如,它可以有多个基于类型参数的静态变量。helper函数接受两个不明显的参数,模块ID和类ID。这些ID取决于加载代码的AppDomain 长话短说,您不可

给定
Thread
引用,是否可以获取该线程的
ThreadStatic
值?

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

长话短说,您不可能进行相同的调用,helper方法甚至不接受线程ID,这是由调用上下文暗示的

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


这完全是故意的。线程本地存储的一个非常好的特性是它总是线程安全的。允许从另一个线程访问它的后门将彻底破坏该功能。如果你想做这件事,你会非常担心的。例如,您可以使用自己的由ManagedThreadId设置关键字的查找表。

[ThreadStatic]
数据是线程的本地数据,以防止多个线程访问一个值时出现问题。允许跨线程访问将无法达到此目的。你想达到什么目的?@jeroenmoster我想让线程将其当前状态存储在ThreadStatic字段中,并让记录器定期转储工作线程状态。我能闻到线程的味道。如果您想访问另一个线程的数据,那么首先为什么它是
[ThreadStatic]
?@Poma,然后使它更面向对象,让您的线程在记录器中注册并传递其状态(定期?)。“告诉,不要问”规则在这里。也许我理解错了,但是如果你想让一个记录器显示一组线程的状态,为什么不把它们保存在一个列表中,并检查每个线程的状态属性呢?我以前也用过这个方法,它很管用,但也许这不是正确的方法,或者不完全是你想要的。