【问题标题】:Is SynchronizationContext.Current reset when a thread goes back to threadpoolSynchronizationContext.Current 是否在线程返回线程池时重置
【发布时间】:2023-03-12 05:11:01
【问题描述】:

假设我有这个代码

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

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

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

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

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

【问题讨论】:

    标签: c# asynchronous threadpool async-await synchronizationcontext


    【解决方案1】:

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

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

    【讨论】:

    • 我更彻底地检查了 .NET 源代码。修改 SynchronizationContext 将修改存储在执行上下文中的值。我知道线程池上的其他作业不会继承执行上下文,即线程池使用捕获的另一个线程池作业的调用者的执行上下文,而不是用于修改它的前一个作业的执行上下文。对吗?
    猜你喜欢
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 2018-10-02
    相关资源
    最近更新 更多