Dot-Net

使用 TPL 時如何管理執行緒本地儲存 (TLS)?

  • January 17, 2018

我想將日誌記錄上下文資訊儲存在 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;
   });

引用自:https://stackoverflow.com/questions/7961233