应用CLR的线程池

大家都知道这个线程的建立和销毁都需要很大的性能开销,当有比较多且不同的任务需要完成时,可以考虑使用线程池来管理这些线程。在以windows NT为内核的操作系统上每个进程都包含一个线程池,在线程池中存在许多可以被随时使用的线程,当应用程序使用时,可以从线程池中直接取出一个已经存在的线程,当某个线程使用完成后,不会立即销毁,而是放入线程池中等待下一次的使用。

在C#中,通过System .Threading.ThreadPool提供了以下的常用方法和说明。

方法名称 说明
BindHandle 将操作系统句柄绑定到ThreadPool。
GetAvailableThreads 检索由GetMaxThreads方法返回的最大线程数和当前活动线程数之间的差值。
GetMaxThreads 检索同时处于活动状态的线程池请求的数目,所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。
GetMinThreads 检索线程池在新请求预测中维护的空闲线程数。    
QueueUserWorkItem 将方法排入队列以便执行,此方法在有线程池线程变得可用时执行。
RegisterWaitForSingleObject 注册正在等待WaitHandle的委托。
SetMaxThreads 设置可以同时处于活动状态的线程池的请求数目。所有大于此数目的请求将保持排队状态,直到线程池线程变得可用。
SetMinThreads 设置线程池在新请求预测中维护的空闲线程数。
UnsafeQueueUserWorkItem 注册一个等待WaitHandle的委托。
UnRegisterWaitForSingleObject 将指定的委托排队到线程池。

举个例子:

 static void Main(string[] args)
        {
            int intWorkThreads;
            int intCompletionPortThreads;
            ThreadPool.GetMaxThreads(out intWorkThreads, out intCompletionPortThreads);
            Console.WriteLine("最大工作线程数:{0},最大I/O线程数:{1}",intWorkThreads,intCompletionPortThreads);
            //获取最大线程数的信息。
            for (int i = 0; i < 3; i++)
            {
                ThreadPool.QueueUserWorkItem(TestThreadPool);//在线程池中申请使用线程。
            }
            Console.ReadLine();
        }
        static void TestThreadPool(object obj)
        {
            for (int i = 0; i < 3; i++)
            {
                //Thread.CurrentThread.ManagedThreadId获取正在运行的线程的标识。
                Console.WriteLine("线程池中,正在运行的线程的唯一标识为{0}",Thread.CurrentThread.ManagedThreadId);
            }
            Thread.Sleep(100);
        }

线程池中运行的线程都是后台线程,就是线程池中的所有线程的IsBackground属性都被设置为True,后台线程不会影响应用程序的结束,而前台的线程对应用程序的结束会有很大影响,因为应用程序的退出必须等待所有的前台线程结束。

时间: 2024-08-03 13:51:48

应用CLR的线程池的相关文章

线程机制、CLR线程池以及应用程序域

最近在总结多线程.CLR线程池以及TPL编程实践,重读一遍CLR via C#,比刚上班的时候收获还是很大的.还得要多读书,读好书,同时要多总结,多实践,把技术研究透,使用好. 话不多说,直接上博文吧.先说一下,为什么Windows要支持线程机制? 1. Windows为什么要支持线程 计算机的早期时代,操作系统没有线程的概念,整个系统只运行着一个执行线程,其中包含操作系统代码和应用程序代码.只用一个执行线程的问题在于,长时间运行的任务会阻止其他任务的执行.例如16位Windows的时代,打印文

线程系列06,通过CLR代码查看线程池及其线程

在"线程系列04,传递数据给线程,线程命名,线程异常处理,线程池"中,我们已经知道,每个进程都有一个线程池.可以通过TPL,ThreadPool.QueueUserWorkItem,委托与线程池交互.本篇体验:通过查看CLR代码来观察线程池及其线程. □ 通过编码查看线程池和线程 使用ThreadPool的静态方法QueueUserWorkItem把线程放入线程池,来看线程池线程和主程序线程的执行情况. class Program { static void Main(string[]

.Net多线程编程—Parallel LINQ、线程池

Parallel LINQ 1 System.Linq.ParallelEnumerable 重要方法概览: 1)public static ParallelQuery<TSource> AsParallel<TSource>(this IEnumerable<TSource> source);启用查询的并行化 2)public static ParallelQuery<TSource> AsOrdered<TSource>(this Paral

使用线程池与专用线程

高效线程使用圣典 严格来讲,线程的系统开销很大.系统必须为线程分配并初始化一个线程内核对象,还必须为每个线程保留1MB的地址空间(按需提交)用于线程的用 户模式堆栈,分配12KB左右的地址空间用于线程的内核模式堆栈.然后,紧接着线程创建后,Windows调用进程中每个DLL都有的一个函数来通知进程 中所有的DLL操作系统创建了一个新的线程.同样,销毁一个线程的开销也不小:进程中的每个DLL都要接收一个关于线程即将"死亡"的通知,而且内核对象 及堆栈还需释放. 如果一台计算机中只有一个C

线程池(C#)

转自:http://blog.sina.com.cn/s/blog_494305f30100ryw7.html 在这里你可以学到Microsoft研究CLR实现线程池的原理机制,从而更灵活的处理CLR在实际代码应中线程池的问题,下面我们来看看吧. CLR教程之线程池的产生 当 CLR 初始化时,其线程池中不含有线程.当应用程序要创建线程来执行任务时,该应用程序应请求线程池线程来执行任务.线程池知道后将创建一个初始线程. 该新线程经历的初始化和其他线程一样:但是任务完成后,该线程不会自行销毁.相反

VB.net学习笔记(三十)认识线程池

水是生命之源,计算机资源也一样. 每一线程尤如一滴水,你花一滴,我花一滴,你还一滴,我还一滴,就象游兵散将一样,线程越多,越复杂混乱.而每一个线程创建需要开销,活动的线程也需要开销.过多的线程导致系统内存占用过度或系统资源不足.为了解决线程生命周期开销问题和资源不足问题,创建线程池,让每滴水(线程)纳入统一管理.特别是那些生存期比较短暂的线程.使用线程池执行任务比每次完成一个任务时都创建一个全新的线程,随后又删除掉的做法更有效率. 一.线程池管理 线程池管埋是指在多线程应用程序的初始化过程屮创建

(CLR via C#学习笔记)异步操作 - 线程池

一 线程池基础 1.线程池维护了一个操作请求队列,将请求的操作追加到线程池队列中,线程池的代码从队列中提取操作项,派发给线程池中的线程; 2.CLR初始化时,线程池中是没有线程的,当有操作派发给线程池时,如果线程池中没有线程或者没有空闲状态的线程,将会创建一个新的线程执行派发的操作,如果有空闲状态的线程,将直接派发一个空闲状态的线程执行操作; 3.线程池线程完成操作任务后,线程不会被销毁,而是返回线程池,进入空闲状态,等待响应另一个派发请求;4.当一个线程池线程处于空闲状态一段时间后(不同的CL

《CLR via C#》之线程处理——线程池与任务

<CLR via C#>之线程处理--线程池与任务 <CLR via C#>之线程处理--线程池与任务线程池线程池用法任务等待任务完成并获取结果(Wait方法和Result属性)取消任务(token的ThrowIfCancellationRequested方法)任务完成自动启动新任务(ContinueWith方法)任务启动子任务任务工厂(TaskFactory和TaskFactory) 线程池 每一个CLR都有一个线程池--由这个CLR控制的所有AppDomain共享.如果一个进程

记5.28大促压测的性能优化&mdash;线程池相关问题

目录: 1.环境介绍 2.症状 3.诊断 4.结论 5.解决 6.对比java实现 废话就不多说了,本文分享下博主在5.28大促压测期间解决的一个性能问题,觉得这个还是比较有意思的,值得总结拿出来分享下. 博主所服务的部门是作为公共业务平台,公共业务平台支持上层所有业务系统(2C.UGC.直播等).平台中核心之一的就是订单域相关服务,下单服务.查单服务.支付回调服务,当然结算页暂时还是我们负责,结算页负责承上启下进行下单.结算.跳支付中心.每次业务方进行大促期间平台都要进行一次常规压测,做到心里