2011-04-22 74 views
3

.NET 4.0引入了ThreadLocal<T>类,这很好。现在,我的应用使用案例需要类似Java的InheritableThreadLocal类。 .NET中有没有这样的东西?如果不是,新线程如何能够使用父线程的线程初始化线程本地变量?我想我需要使用initialization factory method,但不知道该放什么。.NET中可继承的线程

+1

一个有趣的问题;不是一个真正的直接答案,而是*个人*我倾向于通过将每个线程绑定到一个上下文实例来完全避免这种情况。然后我可以在线程之间共享上下文实例,也可以不共享;如我所选。 – 2011-04-22 10:03:03

+0

@Marc:我同意这是大多数情况下的首选方法。然而,在这种情况下,我的代码可能会调用库代码,这些代码可能(或可能不会)产生回调我的代码的线程。所以我并不总是在控制子线程创建。我可能会在每个回调入口处设置一个陷阱来检查它是否是一个新线程来初始化其实例数据,但这比可继承的本地线程存储方法更笨拙。 – 2011-04-22 10:15:07

+0

够公平的;如果你错过了一个更简单的选项,我只是想提一下它。鉴于上述评论,我怀疑你是对的 - 但我不知道像.NET中的InheritableThreadLocal这样的东西,对不起。 – 2011-04-22 10:16:59

回答

0

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

实现ILogicalThreadAffinitive的对象将流经逻辑上下文切换,例如BeginInvoke和ThreadPool.QueueUserWorkItem。还要注意,与使用ThreadLocals相比,在使用线程池的情况下,这种方法更安全,因为您无法在线程上“串联”线程本地值,并让另一个线程无意中发生异常。

+0

我查看了文档,但不知道如何使用它来模仿InheritableThreadLocal的行为。你能详细说明你的答案吗? – 2011-04-25 02:51:40