CLR线程池教程四大功能详解(1)

CLR教程之线程池的产生

(文档下载地址:http://www.ctdisk.com/file/1758317

当 CLR 初始化时,其线程池中不含有线程。当应用程序要创建线程来执行任务时,该应用程序应请求线程池线程来执行任务。线程池知道后将创建一个初始线程。该新线程经历的初始化和其他线程一样;但是任务完成后,该线程不会自行销毁。相反,它会以挂起状态返回线程池。如果应用程序再次向线程池发出请求,那么这个挂起的线程将激活并执行任务,而不会创建新线程。这节约了很多开销。只要线程池中应用程序任务的排队速度低于一个线程处理每项任务的速度,那么就可以反复重用同一线程,从而在应用程序生存期内节约大量开销。

那么,如果线程池中应用程序任务排队的速度超过一个线程处理任务的速度,则线程池将创建额外的线程。当然,创建新线程确实会产生额外开销,但应用程序在其生存期中很可能只请求几个线程来处理交给它的所有任务。因此,总体来说,通过使用线程池可以提高应用程序的性能。线程池的一个绝妙特性是:它是启发式的。如果您的应用程序需要执行很多任务,那么线程池将创建更多的线程。如果您的应用程序的工作负载逐渐减少,那么线程池线程将自行终止。线程池的算法确保它仅包含置于其上的工作负荷所需要的线程数!

因此,希望您现在已理解了线程池的基本概念,并明白了它所能提供的性能优势。现在我将给出一些代码来说明如何使用线程池。首先,您应该知道线程池可以提供四种功能:
◆异步调用方法
◆以一定的时间间隔调用方法
◆当单个内核对象得到信号通知时调用方法
◆当异步 I/O 请求结束时调用方法

前三种功能非常有用,我将在本专栏中加以说明。而应用程序开发人员很少使用第四种功能,因此在此我将不做说明;有可能在将来的专栏中讲到。

功能 1:CLR线程池教程之异步调用方法

在您的应用程序中,如果有创建新线程来执行任务的代码,那么我建议您用命令线程池执行该任务的新代码来替换它。事实上,您通常会发现,让线程池执行任务比让一个新的专用线程来执行任务更容易。要排队线程池任务,您可以使用 System.Threading 命名空间中定义的 ThreadPool 类。ThreadPool 类只提供静态方法,且不能构造它的实例。要让线程池线程异步调用方法,您的代码必须调用一个 ThreadPool 的重载 QueueUserWorkItem 方法,如下所示:

 
 
  1. public static Boolean QueueUserWorkItem(WaitCallback wc, Object state);  
  2. public static Boolean QueueUserWorkItem(WaitCallback wc);  

这些方法将“工作项”(和可选状态数据)排队到线程池的线程中,并立即返回。工作项只是一种方法(由 wc 参数标识),它被调用并传递给单个参数,即状态(状态数据)。没有状态参数的 QueueUserWorkItem 版本将 null 传递给回调方法。最后,池中的某些线程将调用您的方法来处理该工作项。您编写的回调方法必须与 System.Threading.WaitCallback 委托类型相匹配,其定义如下:

 
 
  1. public delegate void WaitCallback(Object state); 

功能 2:CLR线程池教程之以一定的时间间隔调用方法

如果您的应用程序需要在某一时间执行某项任务,或者您的应用程序需要定期执行某些方法,那么使用线程池将是您的最佳选择。System.Threading 命名空间定义 Timer 类。当您构造 Timer 类的实例时,您是在告诉线程池您想在将来的某个特定时间回调自己的某个方法。Timer 类有四种构造函数:

 
 
  1. public Timer(TimerCallback callback, Object state,  
  2. Int32 dueTime, Int32 period);  
  3. public Timer(TimerCallback callback, Object state,  
  4. UInt32 dueTime, UInt32 period);  
  5. public Timer(TimerCallback callback, Object state,  
  6. Int64 dueTime, Int64 period);  
  7. public Timer(TimerCallback callback, Object state,  
  8. Timespan dueTime, TimeSpan period);   

所有这四种构造函数构造完全相同的 Timer 对象。回调参数标识您想由线程池线程回调的方法。当然,您编写的回调方法必须与 System.Threading.TimerCallback 委托类型相匹配,其定义如下:

 
 
  1. public delegate void TimerCallback(Object state); 

构造 Timer 对象后,线程池知道要做什么,并自动为您监视时间。然而,Timer 类还提供了几种其他的方法,允许您与线程池进行通信,以便更改什么时候(或者是否)应当回调方法。具体地说,Timer 类提供了几种 Change 和 Dispose 方法:

 
 
  1. public Boolean Change(Int32    dueTime, Int32    period);  
  2. public Boolean Change(UInt32   dueTime, UInt32   period);  
  3. public Boolean Change(Int64    dueTime, Int64    period);  
  4. public Boolean Change(TimeSpan dueTime, TimeSpan period);   
  5. public Boolean Dispose();  
  6. public Boolean Dispose(WaitHandle notifyObject);  

Change 方法允许您更改 Timer 对象的 dueTime 和 period。Dispose 方法允许您在所有挂起的回调已经完成的时候,完全取消回调,并可选地用信号通知由 notifyObject 参数标识的内核对象。


教程下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值