Вы должны использовать 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();
Подробнее здесь
Пул потоков (по замыслу) поддерживает потоки в рабочем состоянии между вызовами. Это означает, что переменные ThreadStatic будут сохраняться между вызовами QueueUserWorkItem.
На такое поведение также не стоит рассчитывать. ThreadPool (в конце концов, по своему усмотрению) освободит потоки и позволит им завершиться, а также построит новые потоки по мере необходимости.
Однако я бы поставил под сомнение ваш дизайн, если у вас возникнут проблемы с этим. Если вам нужны конкретные детерминированные данные ThreadStatic для использования в QueueUserWorkItem, ваши процедуры потоковой передачи могут быть хорошими кандидатами для самостоятельной обработки потоков. ThreadStatic и ThreadPool - не всегда отличная комбинация - просто не надо t обязательно иметь достаточный контроль (поскольку ThreadPool управляет потоками), чтобы действительно воспользоваться преимуществами переменных ThreadStatic. Вы никогда не узнаете, будут ли два рабочих элемента находиться в одном потоке, в разных потоках, и нужно ли (повторно) инициализировать статическую переменную потока и т. Д.
Я полагаю, они останутся между методами. Конечно, если есть сомнения, сбросьте статические переменные потока в начале вашего рабочего метода. Или используйте попробуйте
/ , наконец,
, чтобы очистить значения после каждой единицы работы.
(править)
Это довольно легко доказать что они действительно остаются; вышеупомянутое быстро начинает печатать числа выше 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;