新的Thread()和Threadpool?

时间:2013-06-27 14:30:01

标签: c# .net multithreading task-parallel-library

为什么线程(我设置IsBackgroundthreadTrue没有运行线程池线程?

/*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

虽然这个代码(显然)确实在线程池线程上运行?

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

P.S。 (我知道Task是(默认情况下)在后台线程运行并且它们在线程池中运行,但我的问题是关于类似的情况,我将线程设置为在后台运行)。)

2 个答案:

答案 0 :(得分:7)

ThreadPool是由运行时管理的专用线程池。

用户创建的后台线程不是线程池的一部分。

换句话说,所有线程池线程都是后台线程,但并非所有后台线程都是线程池线程。

答案 1 :(得分:4)

IsBackground属性不符合您的想法。它只是一个标志告诉CLR当非后台线程完成时是否可以中止线程,包括程序的主线程。如果它是 false ,默认值,则CLR不会干扰线程,允许它完成。将其设置为 true 会调用Thread.Abort()的等效项,减去线程对其执行任何操作或被通知的能力。粗鲁的堕胎。

Thread类创建的线程永远不会被池化,除非使用某种非常罕见的自定义CLR主机。创建线程池线程的常用方法是ThreadPool.QueueUserWorkItem,()BackgroundWorker,委托的BeginInvoke()方法和Task类。