c#线程之前台线程后台线程及使用

 我来答
黑科技1718
2022-07-10 · TA获得超过5875个赞
知道小有建树答主
回答量:433
采纳率:97%
帮助的人:81.8万
展开全部
一、关于前台线程和后台线程

1、简介

CLR中线程分为两种类型,一种是前台线程、另一种是后台线程.

前台线程:应用程序的主线程、Thread构造的线程都默认为前台线程

后台线程:线程池线程都为后台线程

2、区别

2.1 前台线程:前台线程一般执行重要性很高的任务,至于什么是重要性很高,这个需要结合业务综合考虑,哪些操作是当前应用程序必须执行的。

如下控制台程序:

控制台等待DoWork方法执行完成之后关闭。

2.2 后台线程:这里需要注意,当一个进程的所有前台线程关闭时,也就是当应用程序推出的时候,无论后台线程有没有执行完它的任务,它都会被强制关闭.但是,当应用程序开启时,它又会重新启动.后台线程一般执行不重要、耗时很短的任务,就算进程(应用程序)关闭了,导致它强制关闭,也不会造成影响的任务.比如系统清理程序等。

如下控制台程序:

控制台不等子线程处理完成,直接关闭。

注意:一般进程会在所有的前台线程执行完毕时关闭。

二、使用Thread构建异步操作(受限制)

1、Thread简介和使用场景

关于使用Thread类构建线程执行异步操作有以下几点需要注意的:

(1)、Thread本身微软并不建议使用,应为它其中的很多Api并不靠谱(如Start、Join、IsBackground等)

(2)、由于(1)的问题,所以微软将整个Thread类都不开放给Windows Store应用

虽然Thread有很多不好的缺点,但是它还是有它的用武之处,只要满足以下条件:

(1)、如果执行的代码处于一种特定的状态,这种状态对于线程池来说时非同寻常的。

(2)、线程需要以非普通优先级运行.所有线程池线程都以普通优先级运行,虽然可以修改,但是在不同线程池之间,这种优先级无法持续。

(3)、需要线程变现为一个前台线程(什么是前台线程,上面有解释),防止应用程序在线程结束前就关闭了.这个后台线程无法做到(也就是线程池线程)

(4)、线程需要执行长时间的计算任务。

(5)、线程可能存在终止的情况,程序池线程不存在这种情况(它会一直执行).Thread类的Abort方法。

三、CLR线程池

1、进程和CLR的关系
一个进程可以只包含一个CLR,也可以包含多个CLR
2、CLR和AppDomain的关系
一个CLR可以包含多个AppDomain
3、CLR和线程池的关系
一个CLR只包含一个线程池
所以得出一个CLR下的多个AppDomain共享一个线程池和一个进程下的多个CLR拥有多个线程池的结论.注:多个线程池间的线程池相互不产生影响。

4、CLR和线程池和操作请求队列的关系
(1)、CLR第一次初始化时,线程池并没有线程,当应用程序调用异步代码执行一个方法时,会将该请求记录项加入到操作请求队列中,线程池的代码从这个队列中获取记录项,并派发给线程池线程,接着
线程池会创建线程,当然这里会有性能开销,但是当该线程执行完毕之后,线程池会回收这个线程,这里注意:线程池不会直接销毁这个线程,而是让它处于闲置状态.这样就不会产生额外的性能开销。
但是如果该线程如果长时间处于闲置状态,那么线程池会销毁它,关于这个时间的计算很复杂,各个CLR对它的定义各不相同。
(2)、当应用程序向线程池发起了多个请求,线程池会尝试用一个线程来处理你所有的请求,但是如果这个线程处理压力过大,那么它会开启一个新的线程来给它分担压力.以此类推。
(3)、线程池之包含了少量线程,因为如果线程太多,会增加性能开销,当然如果你升级了你电脑的cpu,线程池则会创建更多的线程.这个过程线程池会自动的去读取你得cpu核数信息,自动的去分配合适的线程数
合理地分配CPU资源.当应用程序的压力减轻,那么它会销毁不用的线程。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式