Сохраняется ли локальное хранилище потока между вызовами backgroundworker? - PullRequest
12 голосов
/ 18 февраля 2009

Повторно ли используются потоки backgroundworker?

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

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

РЕДАКТИРОВАТЬ: В этом блоге предполагается, что BackGroundWorker использует ThreadPool , что подразумевает повторное использование потоков Так возникает вопрос; могут ли повторно используемые потоки сохранять локальное хранилище между вызовами?

Ответы [ 2 ]

8 голосов
/ 05 августа 2010

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

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

0 голосов
/ 18 февраля 2009

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

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

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

...