C# 新线程()和线程池?

C# 新线程()和线程池?,c#,.net,multithreading,task-parallel-library,C#,.net,Multithreading,Task Parallel Library,为什么线程(我将IsBackgroundthread设置为True)没有与线程池线程一起运行 /*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.WriteL

为什么线程(我将
IsBackgroundthread
设置为
True
)没有与线程池线程一起运行

/*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、 美国。
(我知道任务(默认情况下)在后台线程上运行,它们在线程池中运行,但我的问题是,在类似的情况下,我将线程设置为在后台运行)。

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

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


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

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

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


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

IsBackground属性的作用与您认为的不同。它只是一个标志,告诉CLR当非后台线程(包括程序的主线程)完成时是否可以中止线程。如果默认值为false,那么CLR将不会干扰线程,从而允许它完成。将其设置为true将调用与Thread.Abort()等效的函数,减去线程对其执行任何操作或收到通知的能力。粗暴的流产


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

IsBackground属性的作用与您认为的不同。它只是一个标志,告诉CLR当非后台线程(包括程序的主线程)完成时是否可以中止线程。如果默认值为false,那么CLR将不会干扰线程,从而允许它完成。将其设置为true将调用与Thread.Abort()等效的函数,减去线程对其执行任何操作或收到通知的能力。粗暴的流产


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

为什么?任务与我的Backgroundthread之间有什么区别?(除了连续性等)为什么?任务和我的背景线有什么区别?(连续性等除外)背景螺纹在所有锻造螺纹结束时结束,而不是在主螺纹结束时结束。新生成的forground线程将使后台线程保持活动状态。后台线程在所有forground线程结束时结束,而不是在主线程结束时结束。新生成的forground线程将使后台线程保持活动状态。“我知道任务始终是后台线程”并不总是,如果设置
TaskScheduler
Task
将在您想要的任何地方运行。@svick yes。(我的意思是默认设置)我将重新措辞。“我知道任务始终是后台线程”并不总是,如果您设置了
TaskScheduler
Task
将在您想要的任何地方运行。@svick yes。(我的意思是违约)我将重新措辞。