ThreadPool线程池 小结
ThreadPool类提供一个线程池,该线程池可用于发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器
线程池通过为应用程序提供一个由系统管理的辅助线程池使您可以更为有效地使用线程。一个线程监视排到线程池的若干个等待操作的状态。当一个等待操作完成时,线程池中的一个辅助线程就会执行对应的回调函数
托管线程池中的线程为后台线程,即它们的 IsBackground 属性为 true。这意味着在所有的前台线程都已退出后,ThreadPool 线程不会让应用程序保持运行
也可以将与等待操作不相关的工作项排列到线程池。若要请求由线程池中的一个线程来处理工作项,请调用 QueueUserWorkItem 方法。此方法将对将被从线程池中选定的线程调用的方法或委托的引用用作参数。一个工作项排入队列后就无法再取消它。
计时器队列中的计时器以及已注册的等待操作也使用线程池。它们的回调函数也会排列到线程池。
每个进程都有一个线程池。线程池的默认大小为每个可用处理器有 25 个线程。使用 SetMaxThreads 方法可以更改线程池中的线程数。每个线程使用默认的堆栈大小并按照默认的优先级运行
示例代码:
using System;
using System.Threading;
public class Example
{
public static void Main()
{ string str = "param";
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc), str);
Thread.Sleep(); Console.ReadKey();
} static void ThreadProc(Object stateInfo)
{
Console.WriteLine(stateInfo);
}
}
QueueUserWorkItem方法将指定的方法排入队列以便执行,并指定包含该方法所用数据的对象
1.不传递参数
public static bool QueueUserWorkItem(WaitCallback callBack);
2.传递参数
public static bool QueueUserWorkItem(WaitCallback callBack, object state);
如果将方法成功排入队列,则为 true;否则为 false。如果排入队列的方法仅需要单个数据项,可以将数据项强制转换为类型 Object。如果该方法需要多个复杂数据,则必须定义包含这些数据的类。
什么时候使用ThreadPool?
ThreadPool的作用:
另一种将任务项排列到线程池的方法,不过这个任务项是拥有等待操作的任务项
ThreadPool.RegisterWaitForSingleObject方法 (WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)
注册一个等待 WaitHandle 的委托(将拥有等待操作的任务项排列到线程池中),并指定一个 32 位有符号整数来表示超时值(以毫秒为单位)。
参数
- waitObject
- 类型:System.Threading.WaitHandle
要注册的 WaitHandle。 使用 WaitHandle 而非 Mutex。
- callBack
- 类型:System.Threading.WaitOrTimerCallback
waitObject 参数终止时调用的 WaitOrTimerCallback 委托。
- state
- 类型:System.Object
传递给委托的对象。
- millisecondsTimeOutInterval
- 类型:System.Int32
以毫秒为单位的超时。 如果 millisecondsTimeOutInterval 参数为 0(零),函数将测试对象的状态并立即返回。 如果 millisecondsTimeOutInterval 为 -1,则函数的超时间隔永远不过期。
- executeOnlyOnce
- 类型:System.Boolean
如果为 true,表示在调用了委托后,线程将不再在 waitObject 参数上等待;如果为 false,表示每次完成等待操作后都重置计时器,直到注销等待。
返回值
类型:System.Threading.RegisteredWaitHandle
封装本机句柄的 RegisteredWaitHandle。
此方法返回的 RegisteredWaitHandle 使用完毕后,请调用其 RegisteredWaitHandle.Unregister 方法来释放对等待句柄的引用。 我们建议始终调用 RegisteredWaitHandle.Unregister 方法,即使将 executeOnlyOnce 指定为 true 也是如此。 如果调用 RegisteredWaitHandle.Unregister 方法而不是取决于注册的等待句柄的终结器,则垃圾回收的工作效率更高。
RegisterWaitForSingleObject 方法将指定的委托排队到线程池。 当发生以下情况之一时,辅助线程将执行委托:
指定对象处于终止状态()。
超时间隔已过期。
RegisterWaitForSingleObject 方法检查指定对象的 WaitHandle 的当前状态。 如果对象状态为非终止状态,则此方法将注册一个等待操作。 此等待操作由线程池中的一个线程来执行。 当对象状态变为终止或超时间隔已过期时,委托由辅助线程执行。 如果 timeOutInterval 参数不为 0(零),并且 executeOnlyOnce 参数为 false,则每当事件收到信号或超时间隔过期时都会重置计时器。
using System;
using System.Threading;
using System.Runtime.CompilerServices; public class ClassForMain
{
private static int i = 0; public static void Main(string[] args)
{
//设置WaitHandle的初始状态为非终止状态时,则此方法将注册一个等待操作
AutoResetEvent argv = new AutoResetEvent(false);
//将超时值设置为2000毫秒,超时间隔已过期时辅助线程将执行委托
ThreadPool.RegisterWaitForSingleObject(argv, new WaitOrTimerCallback(workitem), null, 2000, false);
//设置WaitHandle的状态为终止状态辅助线程将执行委托
argv.Set();
Console.Read();
}
public static void workitem(object O, bool signaled)
{
i += 1;
Console.WriteLine("Thread Pool Work Item Invoked:" + i.ToString());
} }
参考文章:
ThreadPool线程池 小结的更多相关文章
- 转载【浅谈ThreadPool 线程池】
浅谈ThreadPool 线程池 http://www.cnblogs.com/xugang/archive/2010/04/20/1716042.html
- 【多线程】-ThreadPool线程池
ThreadPool介绍: Thread类是一个静态类,所有不存在实例化构造函数操作,直接可以调用其内所存在的方法. 微软官网给出的解释: 提供一个线程池,该线程池可用于执行任务.发送工作项.处理异步 ...
- .net 线程基础 ThreadPool 线程池
1. ThreadPool 线程池异步: //public static bool QueueUserWorkItem(WaitCallback callBack); //public static ...
- 浅谈ThreadPool 线程池(引用)
出自:http://www.cnblogs.com/xugang/archive/2010/04/20/1716042.html 浅谈ThreadPool 线程池 相关概念: 线程池可以看做容纳线程的 ...
- 多线程之旅(ThreadPool 线程池)
一.什么是ThreadPool 线程池(源码) 1.线程池顾名思义,有我们的系统创建一个容器装载着我们的线程,由CLR控制的所有AppDomain共享.线程池可用于执行任务.发送工作项.处理异步 I/ ...
- 多线程 ThreadPool线程池
简单说明一下: 线程池可以看做容纳线程的容器:一个应用程序最多只能有一个线程池:ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池: 每排入一个工作函数,就相 ...
- Delphi ThreadPool 线程池(Delphi2009以上版本适用)
http://blog.sina.com.cn/s/blog_6250a9df0101kref.html 在网上查找Delphi线程池,结果发现寥寥无几. 看了半天源代码,弄得一头雾水,觉得不容易理解 ...
- ThreadPool 线程池的作用
相关概念: 线程池可以看做容纳线程的容器: 一个应用程序最多只能有一个线程池: ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池: 每排入一个工作函数,就相 ...
- 『Python』 ThreadPool 线程池模板
Python 的 简单多线程实现 用 dummy 模块 一句话就可以搞定,但需要对线程,队列做进一步的操作,最好自己写个线程池类来实现. Code: # coding:utf-8 # version: ...
随机推荐
- SSDB 数据库
SSDB数据库 SSDB是一套基于LevelDB存储引擎的非关系型数据库(NOSQL),可用于取代Redis,更适合海量数据的存储. 另外,rocksdb是FB在LevelDB的二次开发版本,因此也存 ...
- Python之路【第七篇续】:I/O多路复用
回顾原生Socket 一.Socket起源: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用[打开][读写][关闭]模式来操作. socket就是该模式的 ...
- [c#]获取exchange中的图片
摘要 在exchange 2007或者2010中获取的邮件内容为html标签格式,也就是一个页面.如果里面含有img标签,你会发现img标签的src属性为cid:xxxxxxxxxxxx的一串字符串, ...
- [译]git rebase -i
使用rebase -i会在终端出现一个交互页面. 在这个交互页面中我们可以对要rebase的commit做一定的修改. 用法 git rebase -i <master> 把当前的分支的c ...
- javascript string 函数集
JavaScript_String对象说明 string中文为"字符串"的意思,String继承自Object对象,此对象提供字符串的查找操作等函数 JavaScript字符串类型 ...
- sharepoint learning resourse
开始学习sharepoint后,我决定将我的个人电脑上也部署一套开发系统,这样回家也可以学习些东西.因此写点关于部署sharepoint需要资源的文字供初学sharepoint的童鞋一起进步,以避免各 ...
- Swift2.1 语法指南——访问控制
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- MySQL监控系统MySQL MTOP的搭建(转VIII)
MySQLMTOP是一个由Python+PHP开发的MySQL企业级监控系统.系统由Python实现多进程数据采集和告警,PHP实现WEB展示和管理.最重要是MySQL服务器无需安装任何Agent,只 ...
- CentOS-6.5安装zabbix2.4.4
使用epel源 (检查网络连接是否正常) //这里使用epel源 [root@localhost /]# wget -O /etc/yum.repos.d/CentOS-Base.repo ht ...
- php导出csv数据在浏览器中输出提供下载或保存到文件的示例
来源:http://www.jb51.net/article/49313.htm 1.在浏览器输出提供下载 /** * 导出数据到CSV文件 * @param array $data 数据 * @pa ...