
1 在IIS中找到这个站点所用的程序池,点击“高级设置…”
2 回收——固定时间间隔(分钟) 改为 0
3 回收——虚拟/专用内存限制(KB) 改为 0
4 进程模型——闲稿李置超时(分钟) 改物敬仿为 0 那一定是IIS的应用程序池回收的机制在作怪了。因为IIS的默认设置里面,如果一个站点所处的应用程序池超过一段时间没有被访问或者请求,IIS就会自动回收这个程序池,并且把进程杀掉。那进程里面的线程肯定也活不下来了。
但是我们可以通过设置应用程序池参数使其不会被简单的自动回收(有些情况无法避免,比如热部署的站点,错误数量超限等等)
一、关于前台线程和后台线程
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资源.当应用程序的压力减轻,那么它会销毁不用的线程。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)