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

Будут ли значения в переменных ThreadStatic по-прежнему присутствовать при циклическом переходе через ThreadPool?

Я использую переменные ThreadStatic для хранения некоторых данных, но я беспокоюсь, что данные, хранящиеся в потоке, будут по-прежнему присутствовать после того, как я закончу с ним и вернусь к ThreadPool. Должен ли я беспокоиться об очистке переменных ThreadStatic до того, как я закончу с помощью потока? Или ThreadPool сделает это для меня, прежде чем "передать его" для следующего QueueUserWorkItem? Это особенно важно для меня, потому что мне нужно убедиться, что другие потоки в моем приложении имеют чистый сланец для работы с точки зрения переменных ThreadStatic. Спасибо!

4b9b3361

Ответ 1

Пул потоков (по дизайну) поддерживает потоки между вызовами. Это означает, что переменные ThreadStatic будут сохраняться между вызовами QueueUserWorkItem.

Такое поведение тоже не стоит рассчитывать. ThreadPool (в конце концов, по своему усмотрению) отменит потоки и вернет их, и при необходимости создаст новые потоки.

Однако я бы поставил под сомнение ваш дизайн, если у вас проблемы с этим. Если вам нужны конкретные детерминированные данные ThreadStatic, которые будут использоваться в QueueUserWorkItem, ваши потоковые процедуры могут быть хорошими кандидатами для обработки потока. ThreadStatic и ThreadPool не всегда отличная комбинация - вам просто не обязательно достаточно управлять (поскольку ThreadPool управляет потоками), чтобы действительно воспользоваться преимуществами переменных ThreadStatic. Вы никогда не узнаете, будут ли два рабочих элемента в одном и том же потоке, в разных потоках и должна ли инициализироваться (re) инициализация потока и т.д.

Ответ 2

Я ожидаю, что они останутся между методами. Конечно, если есть сомнения, reset поточно-статические переменные в начале вашего рабочего метода. Или используйте try/finally, чтобы очистить значения после каждой единицы работы.

(редактировать)

Довольно легко доказать, что они действительно остаются; вышеприведенное быстро начинает печатать числа, превышающие 0 (где 0 каждый раз это то, что мы ожидали бы, если бы разные работники были изолированы):

[STAThread]
static void Main()
{
    for (int i = 0; i < 50; i++)
    {
        ThreadPool.QueueUserWorkItem(DoStuff);
    }
    Console.ReadLine();
}
static void DoStuff(object state)
{
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": " + value++);
    Thread.Sleep(20);
}
[ThreadStatic]
static int value;