2014-02-06 23 views
0

編輯我的問題,關於usr之後的「另一個線程」,下面有更多的信息指出我的問題並不清楚。使用ThreadLocal <T>在不同的類中傳遞數據

如何在不同的類中使用ThreadLocal<T>來傳遞數據?

基本上,我需要將Web服務中的類的LogContext信息傳遞給TraceExtension:SoapExtension類(TraceExtension用於記錄此WebService調用的另一個WebService的請求/響應)。

由於該功能在另一個線程上運行,而不是發起請求的線程,因此我無法從ServiceContext:IExtension <InstanceContext> 中得到它,我通常會使用這種功能。

我有一個使用Thread.GetNamedDataSlot()方式的工作實現,但在性能測試中我們發現存在內存泄漏問題。 (是的,我打電話給Thread.FreeNamedDataSlot(),問題依然存在)。這導致MS post http://support.microsoft.com/kb/2540745可能存在泄漏問題,但在我們目前發佈的時間範圍內,無法在所有生產服務器上部署修復程序。建議的解決方法是使用System.Threading.ThreadLocal類。

到目前爲止我發現的所有資源/例子都具有同一類中的ThreadLocal實例,並且具有Parallelism和PLinq。初始化/設置一個類中的數據並從另一個類中檢索數據的示例非常有用。 將數據傳遞給TraceExtension : SoapExtension的任何其他方式也同樣有用。

我們在時間上有點緊張,任何幫助將不勝感激。

編輯更多信息:

我們的web服務的線程上的請求來自創建上,我們運行一些後臺處理一個新的線程,而返回必要的響應。 新線程調用對其他後端Web服務的調用。我們還有一個TraceExtension類來跟蹤後端Web服務的請求/響應。 我們使用ContextInfo : ISynchronizeInvoke將原始線程的LogContext信息傳遞給新線程上的方法。

問題是獲取LogContext對象從調用後端webservice調用的類到TraceExtension類(它運行在新線程上,而不是原來的線程,客戶端請求來自擁有LogContext的ServiceContext:IExtension<InstanceContext>

+0

「由於功能在另一個線程上運行,而不是發起請求的線程」,因此您不能*使用線程本地狀態,因爲您需要跨線程傳遞數據。我錯過了什麼? – usr

+0

創建新線程時,我使用ContextInfo:ISynchronizeInvoke將上下文信息傳遞給它。所以我在新線程中接收到LogContext,但後來當我將這個新線程調用到後端WebService時,我無法將LogContext傳遞給跟蹤後端webservice的TraceExtension類。 因爲我們沒有爲「不同」線程上的其他東西做後臺處理,所以我們可以從ServiceContext獲取LogContext:IExtension 。但是這種情況並沒有發生,這就是我實際上所說的「在另一個線程上運行」的意思。 –

回答

1

您想要ThreadStaticAttribute

+0

我一定至少看過它10次,並放棄它認爲我不能使用它,因爲它是靜態的,並且不能存儲來自不同實例的值。在我提到使用它之前,我一直在閱讀我的想法想要相信的東西,這真是太神奇了。謝謝Moho。 –

相關問題