应用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 = ; i < ; i++)
{
ThreadPool.QueueUserWorkItem(TestThreadPool);//在线程池中申请使用线程。
}
Console.ReadLine();
}
static void TestThreadPool(object obj)
{
for (int i = ; i < ; i++)
{
//Thread.CurrentThread.ManagedThreadId获取正在运行的线程的标识。
Console.WriteLine("线程池中,正在运行的线程的唯一标识为{0}",Thread.CurrentThread.ManagedThreadId);
}
Thread.Sleep();
}
线程池中运行的线程都是后台线程,就是线程池中的所有线程的IsBackground属性都被设置为True,后台线程不会影响应用程序的结束,而前台的线程对应用程序的结束会有很大影响,因为应用程序的退出必须等待所有的前台线程结束。
应用CLR的线程池的更多相关文章
- 线程机制、CLR线程池以及应用程序域
最近在总结多线程.CLR线程池以及TPL编程实践,重读一遍CLR via C#,比刚上班的时候收获还是很大的.还得要多读书,读好书,同时要多总结,多实践,把技术研究透,使用好. 话不多说,直接上博文吧 ...
- C# 多线程学习系列三之CLR线程池系列之ThreadPool
一.CLR线程池 1.进程和CLR的关系一个进程可以只包含一个CLR,也可以包含多个CLR2.CLR和AppDomain的关系一个CLR可以包含多个AppDomain3.CLR和线程池的关系一个CLR ...
- 线程系列06,通过CLR代码查看线程池及其线程
在"线程系列04,传递数据给线程,线程命名,线程异常处理,线程池"中,我们已经知道,每个进程都有一个线程池.可以通过TPL,ThreadPool.QueueUserWorkItem ...
- 线程池(C#)
转自:http://blog.sina.com.cn/s/blog_494305f30100ryw7.html 在这里你可以学到Microsoft研究CLR实现线程池的原理机制,从而更灵活的处理CLR ...
- .Net多线程编程—Parallel LINQ、线程池
Parallel LINQ 1 System.Linq.ParallelEnumerable 重要方法概览: 1)public static ParallelQuery<TSource> ...
- ThreadPool(线程池)介绍
>>返回<C# 并发编程> 1. 线程池的由来 1.1. 线程池出现前 1.2. 线程池的诞生 1.3. CLR线程池工作过程 2. 线程池解决的问题 2.1. 异步调用方法 ...
- 浅谈线程池(上):线程池的作用及CLR线程池
原文地址:http://blog.zhaojie.me/2009/07/thread-pool-1-the-goal-and-the-clr-thread-pool.html 线程池是一个重要的概念. ...
- (CLR via C#学习笔记)异步操作 - 线程池
一 线程池基础 1.线程池维护了一个操作请求队列,将请求的操作追加到线程池队列中,线程池的代码从队列中提取操作项,派发给线程池中的线程; 2.CLR初始化时,线程池中是没有线程的,当有操作派发给线程池 ...
- CLR线程池
WaitCallback 表示要在 ThreadPool 线程上执行的回调方法. 创建委托,方法是将回调方法传递给 WaitCallback 构造函数. 您的方法必须具有此处所显示的签名. 如果想使用 ...
随机推荐
- joomla建站-双语CMS系统开发的实现
首先,请确保你的网站安装了你所需的双语语言,详细安装过程见:https://www.cnblogs.com/surfer/p/9619345.html 第一步:设置内容管理 可以按照个人需求进行语言编 ...
- select 1浅析
今天看到项目代码里有这条语句,不懂select 1 from XXXXXXX里的1是何意,查了一番才知道: 1.select 1 from mytable;与select anycol(目的表集合中的 ...
- java-IO操作性能对比
在软件系统中,IO速度比内存速度慢,IO读写在很多情况下会是系统的瓶颈. 在java标准IO操作中,InputStream和OutputStream提供基于流的IO操作,以字节为处理单位:Reader ...
- LOL喷子专用自动骂人工具,2018更新完整版!
软件截图 软件说明: 先进入游戏 打开程序 Z开启/C关闭 下载地址:密码 yjnm
- Swift protocol extension method is called instead of method implemented in subclass
Swift protocol extension method is called instead of method implemented in subclass protocol MyProto ...
- 认识单文件组件.vue 文件
vuejs 自定义了一种.vue文件,可以把html, css, js 写到一个文件中,从而实现了对一个组件的封装, 一个.vue 文件就是一个单独的组件.由于.vue文件是自定义的,浏览器不认识,所 ...
- 解决【npm ERR! Unexpected end of JSON input while parsing near '...sh_time":141072930277'】方案
问题描述执行npm install的时候报错npm ERR! Unexpected end of JSON input while parsing near '...sh_time":141 ...
- zay大爷的神仙题目 D1T3-膜你抄
依旧是外链 锦鲤抄 [题目背景] 你在尘世中辗转了千百年 却只让我看你最后一眼 火光描摹容颜燃尽了时间 别留我一人,孑然一身 凋零在梦境里面. ——银临&云の泣<锦鲤抄> [问题描 ...
- C++ STL容器之 stack
STL 中的 stack 是一种容器适配器,而不是一种容器. 它是容器适配器是指,只要支持一系列方法的容器(empty, size, back, push_back, pop_back),都能作为st ...
- BZOJ2007 NOI2010 海拔 平面图转对偶图 最小割
题面太长啦,请诸位自行品尝—>海拔 分析: 这是我见过算法比较明显的最小割题目了,很明显对于某一条简单路径,海拔只会有一次变换. 而且我们要最终使变换海拔的边权值和最小. 我们发现变换海拔相当于 ...