5

假设我有这个代码

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

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

当前同步上下文泄漏回线程池。如果有人再次调用 ThreadPool.QueueUserWorkItem 并且使用同一个线程来处理另一个工作项,那么该线程的当前同步上下文会被重置回 null 还是会保持 MyCustomSynchronizationContext?

相同的答案是否适用于在线程池上执行任务的任何其他方式,例如 Task.Run、BeginInvoke 等?

我知道通常 TLS 不会重置,但 .NET 源代码显示当前同步上下文的存储不是很明确定义(大部分时间它来自执行上下文,但对于某些 WinRT 来说似乎是特殊情况原因)。

4

1 回答 1

2

答案在技术上是未定义/未记录的。你不应该把 aSynchronizationContext放在线程池线程上而不清理它。

也就是说,我强烈怀疑SynchronizationContext没有清除。对于在线程池上执行任务的任何代码都是如此。

于 2014-02-26T12:20:18.717 回答