当线程返回到线程池时,SynchronizationContext.Current是否重置

时间:2014-02-26 05:02:02

标签: c# asynchronous threadpool async-await synchronizationcontext

假设我有这段代码

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

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

当前同步上下文被泄漏回线程池。如果有人再次调用ThreadPool.QueueUserWorkItem并且使用相同的线程来处理其他工作项,那么该线程的当前同步上下文是否会重置为null或者它是否会保留MyCustomSynchronizationContext?

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

我知道一般来说TLS没有重置但是.NET源代码显示当前同步上下文的存储没有非常明确地定义(大多数时候它来自executioncontext但它似乎是特殊的WinRT由于某种原因)。

1 个答案:

答案 0 :(得分:2)

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

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