new Thread() and Threadpool?

本文关键字:Threadpool and Thread new | 更新日期: 2023-09-27 18:20:12

为什么线程(我将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.s。(我知道Task(默认情况下)在后台线程中运行,它们在线程池中运行,但我的问题是关于类似的情况,即我将线程设置为在后台运行)

new Thread() and Threadpool?

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

用户创建的后台线程不属于线程池。

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

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

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