SynchronizationContext.Current сбрасывается, когда поток возвращается в пул потоков

Допустим, у меня есть этот код

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

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

Текущий контекст синхронизации просачивается обратно в пул потоков. Если кто-то снова вызовет ThreadPool.QueueUserWorkItem и тот же поток будет использоваться для обработки другого рабочего элемента, будет ли текущий контекст синхронизации этого потока сброшен до нулевого или останется MyCustomSynchronizationContext?

Применяется ли тот же ответ к любому другому способу выполнения задач в пуле потоков, например. Task.Run, BeginInvoke и т. д.?

Я знаю, что обычно TLS не сбрасывается, но исходный код .NET показывает, что хранилище текущего контекста синхронизации не очень четко определено (в большинстве случаев это происходит из контекста выполнения, но, похоже, это особый случай для WinRT для некоторых причина).


person Palo    schedule 26.02.2014    source источник


Ответы (1)


Ответ технически не определен/недокументирован. Вы не должны помещать SynchronizationContext в поток пула потоков, не очистив его.

Тем не менее, я сильно подозреваю, что SynchronizationContext не очищается. Это справедливо для любого кода, выполняющего задачи в пуле потоков.

person Stephen Cleary    schedule 26.02.2014
comment
Я более тщательно проверил исходный код .NET. Изменение SynchronizationContext изменит значение, хранящееся в контексте выполнения. Я понимаю, что контекст выполнения не наследуется для других заданий в пуле потоков, т. е. пул потоков использует захваченный контекст выполнения вызывающей стороны другого задания пула потоков, а не тот, который использовался для предыдущего задания, которое его изменило. Это правильно? - person Palo; 27.02.2014