2013-06-27 2 views
1

Почему Thread (который я установил IsBackgroundthread на True) не работает с threadpool Threads?новый Thread() и Threadpool?

/*1*/ volatile bool r = false; 
/*2*/ var g= new Thread(() => r=Thread.CurrentThread.IsThreadPoolThread); 
/*3*/ g.IsBackground = true; 
/*4*/ g.Start(); 
/*5*/ g.Join(); 
/*6*/ Console.WriteLine(r); //false 

Хотя этот код (очевидно) работает в потоке threadpool?

Task.Factory.StartNew(()=>Console.Write(Thread.CurrentThread.IsThreadPoolThread)); //true 
Console.ReadLine(); 

p.s. (я знаю, что задачи являются (по умолчанию) работать на фоновых потоков, и они работают в ThreadPool, но мой вопрос о подобной ситуации, когда я поставил поток работать на заднем плане).)

+0

«Я знаю, что задача всегда является фоновым потоком». Не всегда, если вы установите «TaskScheduler», «Задача» будет работать там, где вы хотите. – svick

+0

@svick да действительно. (Я имею в виду по умолчанию). Я перефразирую. –

ответ

4

Свойство IsBackground не делает то, что вы думаете. Это просто флаг, который сообщает CLR, нормально ли отменять поток при завершении нефоновых потоков, включая основной поток программы. Если это false, значение по умолчанию, то CLR не будет мешать потоку, позволяя ему завершить. Установив его на true вызывает эквивалент Thread.Abort(), минус возможность для потока что-либо об этом или получать уведомление об этом. Грубая отмена.

Нить, созданная классом Thread, никогда не объединяется, если не используется какой-либо пользовательский хост CLR, что очень редко. Обычными способами создания потока threadpool являются ThreadPool.QueueUserWorkItem,() BackgroundWorker, метод BeginInvoke() делегата и класс Task.

+1

Фоновая нить заканчивается, когда все торцевые нити заканчиваются, а не когда заканчивается основная нить. Новообразованные фоновые потоки будут поддерживать фоновые потоки. – Servy

6

ThreadPool представляет собой пул , посвященный потокам, управляемым средой выполнения.

Созданные пользователем потоки фона не являются частью потока.

Другими словами, все потоки потоков нитей являются фоновыми потоками, но не все фоновые потоки являются потоками потоков.

+0

Почему? В чем разница между Задачей на моем Backgroundthread? (за исключением непрерывности и т. д.) –

+1

oh. ОК. второе редактирование делает его более ясным. –