C#异步编程的实现方式(3)——ThreadPool线程池

348 篇文章 0 订阅
67 篇文章 0 订阅
C#异步编程的实现方式(3)——ThreadPool线程池

在需要创建的线程很多,且都是比较小的线程的情况下,可以使用线程池(ThreadPool类)。ThreadPool是一个静态方法,提供了对一个线程集合的操作,它会在线程数不足时增加线程,空闲线程数过多时释放资源。

 

1、ThreadPool简单应用

调用ThreadPool.QueueUserWorkItem()方法,传递一个WaitCallBack委托类型的方法,并把这个方分配给线程池中的线程。线程池是自动运行的,如果线程池还没有运行,就会创建一个线程池,并启动第一个线程。如果线程池己经在运行,且有一个空闲线程来完成该任务,就把该作业传递给这个线程。

下面这个方法是一个符合WaitCallBack委托的方法:

   1: static void WaitCallBackMethod(object param)
   2: {
   3:     for (int i = 0; i < 5; i++)
   4:     {
   5:         Console.WriteLine(String.Format("Thread {0} is running", param));
   6:         Thread.Sleep(1000);
   7:     }
   8: }

然后在主线程里给线程池添加方法:

   1: static void Main(string[] args)
   2: {
   3:     for (int i = 1; i <= 3; i++)
   4:     {
   5:         ThreadPool.QueueUserWorkItem(WaitCallBackMethod, i);
   6:     }
   7:     Console.Read();
   8: }

QueueUserWorkItem()方法的第二个参数是个object类型的参数,可传入一个数据到线程中。在主线程中,传入了3个方法到线程池中。运行结果如下:

image

可以看见三个线程分别在行动。顺序不一样是因为操作系统调度的原因。

 

2、最大与最小线程数

ThreadPool类会在需要时增减池中线程的线程数,直到最大的线程数。池中的最大线程数是可配置的。在双核CPU中,默认设置为1023个工作线程和1000个I/O线程。也可以指定在创建线程池时应立即启动的最小线程数,以及线程池,中可用的最大线程数。如果有更多的作业要处理,线程池中线程的个数也到了极限,最新的作业就要排队,且必须等待线程完成其任务。

可用下面的方法查看:

   1: static void MaxThreads()
   2: {
   3:     int workerThreads;
   4:     int ioThreads;
   5:  
   6:     ThreadPool.GetMaxThreads(out workerThreads, out ioThreads);
   7:     Console.WriteLine(String.Format("Max worker threads: {0};    Max I/O threads: {1}", workerThreads, ioThreads));
   8:  
   9:     ThreadPool.GetMinThreads(out workerThreads, out ioThreads);
  10:     Console.WriteLine(String.Format("Min worker threads: {0};    Min I/O threads: {1}", workerThreads, ioThreads));
  11: }

结果为:

image

 

3、线程池的限制

  • 线程池中的所有线程都是后台线程。如果进程的所有前台线程都结束了,所有的后台线程就会停止。不能把入池的线程改为前台线程。
  • 不能给入池的线程设置优先级或名称。
  • 对于COM对象,入池的所有线程都是多线程单元(Multithreaded Apartment,MTA)线程。许多COM对象都需要单线程单元(Multithreaded Apartment,MTA)线程。
  • 入池的线程只能用于时间较短的任务。如果线程要一直运行(如Word的拼写检查器线程),就应使用Thread类创建一个线程。

 

参考资料:《C#高级编程》

 

本文源代码:

width="98" height="120" src="https://skydrive.live.com/embed?cid=987912DC4988074B&resid=987912DC4988074B%219066&authkey=ABtxsUmFIhXf4k4" frameborder="0" scrolling="no">

分类: C#编程
2
0
(请您对文章做出评价)
« 上一篇: C#异步编程的实现方式(2)——Thread类
» 下一篇: C#异步编程的实现方式(4)——Task任务
posted @ 2012-08-11 16:51 Mysterious One 阅读( 6948) 评论( 7) 编辑 收藏

  
#1楼 2012-08-13 10:30 Slardar  
"且都是比较小的线程的情况下" 比较小的线程是啥意思?
  
#2楼 [ 楼主] 2012-08-14 01:39 Mysterious One  
@ Slardar
预计运行时间比较短的
http://pic.cnblogs.com/face/u199077.jpg?id=21222252
  
#3楼 2012-08-16 12:48 fjt  
这个有用
  
#4楼 2012-08-17 10:03 Ronaltn  
如果是长任务,怎么处理?
  
#5楼 2013-04-02 09:43 nx288882  
谢谢楼主分享~哈哈
  
#6楼 2013-11-25 09:50 Area gs  
  
#7楼 3002769 2014/8/7 17:18:50 2014-08-07 17:18 java -First  
C# 线程池临时用用而已 除了方便没啥优点了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值