Подтвердить что ты не робот

Существует ли локальное хранилище потоков между вызовами фонового рабочего?

Повторяются ли темы рабочего стола?

В частности, если я установил именованный слот данных (потоковое локальное хранилище) во время DoWork() метода фонового работника, будет ли значение этого слота данных сохраняться, потенциально можно найти какой-то другой поток позднее?

Я бы так не подумал, но у меня есть эта ошибка...

EDIT: Это сообщение в блоге предполагает, что BackGroundWorker использует ThreadPool, что подразумевает, что Threads повторно используются. Так возникает вопрос; Повторно используемые потоки потенциально сохраняют локальное хранилище потоков между вызовами?

4b9b3361

Ответ 1

Когда пул потоков повторно использует поток, он не очищает данные в локальном хранилище потоков или в полях, отмеченных атрибутом ThreadStaticAttribute. Следовательно, данные, помещенные в локальное хранилище потоков одним способом, могут быть подвергнуты любому другому методу, который выполняется одним и тем же потоком пула потоков. Метод, который обращается к полю, помеченному атрибутом ThreadStaticAttribute, может столкнуться с различными данными в зависимости от того, какой поток потока потока выполняет его.

источник: http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

Ответ 2

Ну, внутренне BackgroundWorker использует BeginInvoke, что означает (я считаю), что он использует один из потоков из ThreadPool. Что касается того, если TLS очищается, когда потоки возвращаются в пул, я не могу сказать наверняка.

В ответ на редактирование ничего, что я видел в Reflector, не говорит о том, что слоты TLS очищаются или освобождаются после возвращения в пул. Поэтому вы должны явно очистить их до того, как вернется метод DoWork.

Ответ 3

Нужно проверить источник (или через Reflector), чтобы определить это, если он не указан в MSDN.

Если он не указан, вы не можете полагаться на текущее поведение, которое не изменяется в будущей версии .NET.

Edit: Похоже, что он использует пул потоков, поэтому потоки будут повторно использоваться.