//ThreadPool(线程池)是一个静态类,它没有定义任何的构造方法(),我们只能够使用它的静态方法,这是因为,这是因为ThreadPool是托管线程池(托管线程池http://msdn.microsoft.com/zh-cn/library/0ka9477y
//ThreadPool使用WaitCallback委托,它所要做的工作是在后台进行的。使工作项的排队和运行更容易
//ThreadPool 目标是为了减除线程的初始化开销,实现并行处理。

//一个ThreadPool里面注册的线程拥有默认的堆栈大小,默认的优先级。并且,他们都存在于多线程空间(Multithreaded apartment)中。

//ThreadPool 中的Thread不能手动取消,也不用手动开始。所以ThreadPool并不适用比较长的线程。你要做的只是把一个WaitCallback委托塞给 ThreadPool,然后剩下的工作将由系统自动完成。系统会在ThreadPool的线程队列中一一启动线程。

//当线程池满时,多余的线程会在队列里排队,当线程池空闲时,系统自动掉入排队的线程,以保持系统利用率。

//在以下情况中不宜使用ThreadPool而应该使用单独的Thread:
     //1,需要为线程指定详细的优先级
    //2,线程执行需要很长时间
    //3,需要把线程放在单独的线程apartment中
    //4,在线程执行中需要对线程操作,如打断,挂起等。

//通常是将计算密集型的操作放在worker线程池中运行,而线程池的大小会根据当前的CPU使用量自动调整,通过下面两个方法,我们可以设置线程池的大小:
    //ThreadPool.SetMaxThreads(10, 200);
   //ThreadPool.SetMinThreads(2, 40);

先看一个简单的例子(运行结果不会每次都一样,这应该是ThreadPool后台处理的正常反应)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; namespace HreadPool
{
class Program
{ static int j = 0;
public static void Main(string[] args)
{
for (int i = 0; i < 2; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), i);
}
//new Timer(new TimerCallback(DoWork), (object)2, 0, 2000);
Console.ReadLine();
} //加入到线程池中的方法需是static类型,参数必须是object的类型,并且只能有一个参数,或者没有参数
static void DoWork(object state)
{
j++;
int treadNumber = (int)state;
Console.WriteLine("线程{0}来报告了!", treadNumber);
Console.WriteLine();
Console.WriteLine(j);
}
}
}

  接下来考虑如何用ThreadPool来调度一些周期性运行的工作,.NET提供了System.Threading.Timer类实现这一个功能。涉及Timer和TimerCallback。后者也是一个委托,其声明如下:
    public delegate void TimerCallback(object state);

例如:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; namespace HreadPool
{
class Program
{ static int j = 0;
public static void Main(string[] args)
{
new Timer(new TimerCallback(DoWork), (object)2, 0, 2000);
Console.ReadLine();
} //加入到线程池中的方法参数必须是object的类型,并且只能有一个参数,或者没有参数
static void DoWork(object state)
{
j++;
int treadNumber = (int)state;
Console.WriteLine("线程{0}来报告了!", treadNumber);
Console.WriteLine();
Console.WriteLine(j);
}
}
}

 

new Timer(new TimerCallback(DoWork), (object)2, 0, 2000);(延迟时间为0,周期为2秒执行一次DoWork方法)
后面的两个参数是启动的延迟时间和周期。

最新文章

  1. Visual SVN Server启动失败0x8007042a错误
  2. 编译器错误消息: CS0234: 命名空间“Purple”中不存在类型或命名空间名称“Model”(是否缺少程序集引用?)
  3. 1.7.5 Faceting
  4. Windows Azure上的Odoo(OpenERP)-1.创建Ubuntu虚拟机,安装PostgreSQL 数据库
  5. php递归json类实例代码
  6. $(document).ready()与window.onload的区别(转发)
  7. 【经典dp】 poj 3671
  8. Ubuntu安装pycharm
  9. Dynamics 365-关于Solution的那些事(三)
  10. CHM文件命令转换成html
  11. Android 实战之酷云(一)
  12. [UE4]行为树,组合节点:Selector和Sequence
  13. jenkins发邮件问题
  14. Thymeleaf模板如何获取springMVC返回的model值
  15. Web端测试
  16. Android开发—Volley 的使用
  17. Asp.net Web Api开发Help Page 添加对数据模型生成注释的配置和扩展
  18. MSSQL备份脚本
  19. 【hdoj_2152】Fruit(母函数)
  20. 【git】新建一个git仓库的方法

热门文章

  1. html5中的空格符
  2. 82.QT实现委托构造
  3. 70.lambda表达式逻辑(二进制转换为为十进制)
  4. ip---查看网络信息
  5. syslog日志介绍
  6. Python爬虫之『urlopen』
  7. nexus 搭建maven私服
  8. 【Educational Codeforces Round 36 A】 Garden
  9. jquery的图片轮播 模板类型
  10. cocos2d-x 3.0 Loading界面实现