在.NET中的可继承线程本地存储

3
.NET 4.0引入了ThreadLocal<T>类,非常好用。现在,我的应用程序需要像Java的InheritableThreadLocal类一样的东西。.NET中有类似的吗?如果没有,新线程如何使用父线程的本地变量进行初始化?我想我需要使用初始化工厂方法,但不确定该放什么。

1
一个有趣的问题;并不是一个直接的答案,但是个人而言,我倾向于通过将每个线程绑定到一个上下文实例来完全避免这种情况。然后我可以选择在线程之间共享上下文实例,或者不共享。 - Marc Gravell
@Marc:我同意在大多数情况下这是首选方法。但是,在这种情况下,我的代码可能会调用库代码,该库代码可能(也可能不)生成调用回到我的代码的线程。因此,我并不总是控制子线程的创建。我可能能够在每个回调入口处设置陷阱,以检查它是否是新线程以初始化其实例数据,但这比可继承的本地线程存储方法更为笨拙。 - Buu
好的,我只是想提一下,以防你错过了一个更简单的选项。鉴于上面的评论,我怀疑你是对的 - 但我不知道.NET中是否有类似"InheritableThreadLocal"的东西,抱歉。 - Marc Gravell
1个回答

0

我能想到的最接近的方法是使用ILogicalThreadAffinitive,并使用CallContext.SetData将您的对象存储在线程的CallContext中。

实现ILogicalThreadAffinitive的对象将在逻辑上下文切换(例如BeginInvoke和ThreadPool.QueueUserWorkItem)中流动。此外,请注意,与使用ThreadLocals相比,此方法更安全,因为您无法“滞留”线程本地值并使另一个线程意外地拾取它,尤其是在使用线程池的情况下。


我查看了文档,但不确定如何使用它来模仿InheritableThreadLocal的行为。您能详细说明一下吗? - Buu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接