2013-06-03 127 views
6

我有一個WCF服務,它將每個調用記錄到數據庫。稍後,如果發生異常,它也會記錄到單獨的數據庫中。C#中的線程上下文究竟是什麼?

我想要一種方式將這兩個日誌綁定在一起,以便我們可以看到可能導致異常的原因。爲了做到這一點,我想要一些獨特的ID,我可以獲得每個電話。因爲整個事情正在一個線程上執行,所以我可以例如將線程名稱設置爲一個GUID,例如。 System.Threading.Thread.CurrentThread.Name = Guid.NewGuid().ToString();但這有點哈克。

在網上搜索,我發現System.Threading.Thread.CurrentContext.SetProperty(),但我想知道具體的背景是什麼。它是否被設計爲在線程期間存儲屬性?每個線程是否獨一無二?

如果我有5個併發WCF調用,我不希望在上下文中發生的事情之間發生任何衝突,如果它不是'每次調用'可以這麼說。

有人可以澄清嗎?

回答

5

因爲微軟說這是僅供內部使用,我不會使用該屬性:

"This API supports the .NET Framework infrastructure and is not intended to be used directly from your code."

但是,你應該能夠使用Thread Local Storage做同樣的事。該鏈接給出了一個示例,顯示如何爲線程設置字符串屬性。

另請參閱http://www.c-sharpcorner.com/UploadFile/1d42da/working-with-thread-local-storagetls-in-C-Sharp/

+0

哦有趣,謝謝! – NibblyPig

+2

作爲更新,如果您使用的是.NET 4.6,則應該將'ThreadLocal'切換爲['AsyncLocal'](https://msdn.microsoft.com/zh-cn/library/dn906268(v = vs.110) ).aspx),這可以讓您的存儲在異步/等待邊界上流動,您可以最終跳出線程。 –