5

比方說,我有這樣的代碼是,當一個線程返回線程池

ThreadPool.QueueUserWorkItem(unused => 
    { 
     SynchronizationContext.SetSynchronizationContext(
      new MyCustomSynchronizationContext()); 

     // not reset back to null 
    }, null); 

當前同步上下文被泄露回線程池SynchronizationContext.Current復位。如果有人再次調用ThreadPool.QueueUserWorkItem並且使用同一個線程來處理另一個工作項,那麼該線程的當前同步上下文是否會重置爲null,還是會保留MyCustomSynchronizationContext?

相同的答案是否適用於在線程池上執行任務的任何其他方式,例如Task.Run,​​BeginInvoke等?

我知道一般情況下,TLS不會重置,但.NET源代碼顯示當前同步上下文的存儲空間不是非常明確(大部分時間來自executioncontext,但它似乎是特殊裝入的對於WinRT出於某種原因)。

回答

2

答案在技術上未定義/無證。您不應該在線程池線程上放置SynchronizationContext而不清理它。

這就是說,我強烈懷疑SynchronizationContext未被清除。對於任何在線程池上執行任務的代碼都是如此。

+0

我更徹底地檢查了.NET源代碼。修改SynchronizationContext將修改存儲在執行上下文中的值。我知道線程池上的其他作業不會繼承執行上下文,即線程池使用捕獲的其他線程池作業的調用者的執行上下文,而不是前一個用於修改它的作業的執行上下文。那是對的嗎? – Palo