2011-04-22 31 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