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: ...
随机推荐
- Django基础,Day10 - template 模板引擎与路径设置
作为一个Web框架,Django需要一个方便的方式来生成动态的HTML.最常见的方法依赖于模板.模板包含所需的HTML输出的静态部分以及一些特殊的语法描述如何插入动态内容. Django框架后端默认支 ...
- Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR模式']
public function getMinLimit () { $sql = "..."; $result = yii::app()->db-& ...
- Storm集群安装部署步骤【详细版】
作者: 大圆那些事 | 文章可以转载,请以超链接形式标明文章原始出处和作者信息 网址: http://www.cnblogs.com/panfeng412/archive/2012/11/30/how ...
- [c#]RabbitMQ的简单使用
摘要 Message Queue消息队列,简称MQ,是一种应用程序对应用程序的通信方法,应用程序通过读写出入队列的消息来通信,而无需专用连接来链接它们.消息传递指的是程序之间通过在消息中发送数据进行通 ...
- svn更改分支名字,move命令
名称 svn move — 移动一个文件或目录. 概要 svn move SRC DST 描述 这个命令移动文件或目录到你的工作拷贝或者是版本库. 提示 这个命令同svn copy加一个svn del ...
- mongodb 与 c++ 的配合使用
最近在尝试使用 mongodb 作为服务端持久化方案,服务端程序是使用 c++ 写的,折腾了不少时间,记录一下吧. 1.下载 boost 1.56.0 http://www.boost.org/use ...
- [译]bare repository
git init --bare 使用--bare创建的repository没有工作目录, 在这个repository中不能修改文件和commit. 中心repository必须是bare reposi ...
- iOS 8 牛刀小试
iOS 8 牛刀小试 1.UIWindow的bounds发生变化(Window本身发生了旋转) iOS 7之前Window的bounds不会随着方向而变化,但是到了iOS 8以后,随着设备方向的旋转, ...
- informatica中元数据管理
摘自: http://blog.itpub.net/28690368/viewspace-766528/ informaica是一个很强大的ETL工具,WORKFLOW MANAGER负责对ETL调度 ...
- C++调用shell
1.直接采用system() 2.popen http://www.cnblogs.com/xitang/p/4288808.html