Dot-Net
使用 TPL 時如何管理執行緒本地儲存 (TLS)?
我想將日誌記錄上下文資訊儲存在 TLS 中,以便我可以在入口點設置一個值,並使該值在所有生成的堆棧中都可用。這很好用,但我也使用 TPL 和 ThreadPool。那麼問題就變成瞭如何將 TLS 數據遷移到其他執行緒。我可以自己做這一切,但是我失去了像 Parallel.For 這樣的好方法。
使用 TPL 時有什麼方法可以複製 TLS 嗎?當 C# 獲得 await 功能時,這也將適用於它。
謝謝,埃里克
通常,這是通過使用已經提供執行緒本地數據的Parallel.For重載來處理的。
這個重載允許你提供一個初始化和一個終結委託,它有效地成為你的執行緒本地數據的每個執行緒的初始化,以及最後的歸約函式以將結果“合併”在一起(每個執行緒執行一次)。 我在這裡詳細寫了這個。
基本形式是執行以下操作:
object sync = new object(); double result = 0; Parallel.For(0, collection.Count, // Initialize thread local data: () => new MyThreadSpecificData(), // Process each item (i, pls, currentThreadLocalData) => { // Generate a NEW version of your local state data MyThreadSpecificData newResults = ProcessItem(collection, i, currentThreadLocalData); return newResults; }, // Aggregate results threadLocalData => { // This requires synchronization, as it happens once per thread, // but potentially simultaneously lock(sync) result += threadLocalData.Results; });