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