繁体   English   中英

新的Thread()和Threadpool?

[英]new Thread() and Threadpool?

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

/*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();

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

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

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

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

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

除非使用某种非常少见的自定义CLR主机,否则从不合并Thread类创建的线程。 创建线程池线程的常用方法是ThreadPool.QueueUserWorkItem,()BackgroundWorker,委托的BeginInvoke()方法和Task类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM