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());
} }

参考文章:

  1. ThreadPool(线程池)in .Net
  2. C#线程同步的几种方法
  3. 浅谈ThreadPool 线程池
  4. ThreadPool 类
  5. ThreadPool(线程池)

ThreadPool线程池 小结的更多相关文章

  1. 转载【浅谈ThreadPool 线程池】

    浅谈ThreadPool 线程池 http://www.cnblogs.com/xugang/archive/2010/04/20/1716042.html

  2. 【多线程】-ThreadPool线程池

    ThreadPool介绍: Thread类是一个静态类,所有不存在实例化构造函数操作,直接可以调用其内所存在的方法. 微软官网给出的解释: 提供一个线程池,该线程池可用于执行任务.发送工作项.处理异步 ...

  3. .net 线程基础 ThreadPool 线程池

    1. ThreadPool 线程池异步: //public static bool QueueUserWorkItem(WaitCallback callBack); //public static ...

  4. 浅谈ThreadPool 线程池(引用)

    出自:http://www.cnblogs.com/xugang/archive/2010/04/20/1716042.html 浅谈ThreadPool 线程池 相关概念: 线程池可以看做容纳线程的 ...

  5. 多线程之旅(ThreadPool 线程池)

    一.什么是ThreadPool 线程池(源码) 1.线程池顾名思义,有我们的系统创建一个容器装载着我们的线程,由CLR控制的所有AppDomain共享.线程池可用于执行任务.发送工作项.处理异步 I/ ...

  6. 多线程 ThreadPool线程池

    简单说明一下: 线程池可以看做容纳线程的容器:一个应用程序最多只能有一个线程池:ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池: 每排入一个工作函数,就相 ...

  7. Delphi ThreadPool 线程池(Delphi2009以上版本适用)

    http://blog.sina.com.cn/s/blog_6250a9df0101kref.html 在网上查找Delphi线程池,结果发现寥寥无几. 看了半天源代码,弄得一头雾水,觉得不容易理解 ...

  8. ThreadPool 线程池的作用

    相关概念: 线程池可以看做容纳线程的容器: 一个应用程序最多只能有一个线程池: ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池: 每排入一个工作函数,就相 ...

  9. 『Python』 ThreadPool 线程池模板

    Python 的 简单多线程实现 用 dummy 模块 一句话就可以搞定,但需要对线程,队列做进一步的操作,最好自己写个线程池类来实现. Code: # coding:utf-8 # version: ...

随机推荐

  1. ILMerge

    ILMerge http://www.microsoft.com/en-hk/download/details.aspx?id=17630 ILMerge 下载地址:http://www.micros ...

  2. LINQ的左连接、右连接、内连接

    .左连接: var LeftJoin = from emp in ListOfEmployees join dept in ListOfDepartment on emp.DeptID equals ...

  3. Request.GetOwinContext()打不到

    Although it's in the Microsoft.Owin.Host.SystemWeb assembly it is an extension method in the System. ...

  4. Jquery中的$().each() 方法

    先举例子, 输出每个 li 元素的文本: <html> <head> <script type="text/javascript" src=" ...

  5. Spring Ioc--Bean装配

    继前一篇IoC概述.Spring容器总结,接下来总结下Bean的装配过程. 要使引用程序中的Spring容器成功启动,需要同时具备以下3个条件: 1.Spring框架的类包,放在应用程序的类路径下. ...

  6. webservice报错Message part refundRequest was not recognized. (Does it exist in service WSDL?)

    最近在做一个支付的接口. 因为接口方使用webservice交互.  我只能去学习了下webservice 现在出了一个很古怪的问题~  我在请求他们url的时候, 返回给我找不到控制名错误 Mess ...

  7. [译]git revert

    git revert git revert用来撤销一个已经提交了的快照. 但不是从项目历史中移除这个commit, 而是生成一个新的commit, 老的commit还是保留在历史项目里面的. 这样做的 ...

  8. [译]Node.js : Building RESTful APIs using Loopback and MySQL

    国庆后可能就要使用StrongLoop那套东西来做项目了 原文:http://www.javabeat.net/loopback-mysql/ Loopback是什么? Loopback是一个开源的N ...

  9. godaddy空间的sql server数据库没办法insert中文

    原来的代码: use string007 from sysobjects where id = object_id('K_V_TEST') and type = 'U') drop table K_V ...

  10. UI第二节——UIButton详解

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...