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

Вы должны использовать concat() вместо merge().

Вы можете следовать этой схеме:

// Our sources (left as an exercise for the reader)
Observable memory = ...;
Observable disk = ...;
Observable network = ...;

// Retrieve the first source with data
Observable source = Observable
  .concat(memory, disk, network)
  .first();

Подробнее здесь

13
задан skb 12 May 2009 в 21:33
поделиться

2 ответа

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

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

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

12
ответ дан 1 December 2019 в 23:48
поделиться

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

(править)

Это довольно легко доказать что они действительно остаются; вышеупомянутое быстро начинает печатать числа выше 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;
5
ответ дан 1 December 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: