跟我学VS#语言编程技术——C#中的线程池Thread Pool技术及应用示例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.1跟我学VS#语言编程技术——C#中的线程池Thread Pool技术及应用示例1.1.1C#中的线程池Thread Pool技术及应用示例
1、线程池Thread Pool技术概述
我们知道,大部分应用程序都是通过线程工作的,该线程等待一些引入的连接,一旦接收到一个连接,就会创建一个新的线程,并且要求这个线程服务于这个新的连接。
在此种工作方式下,当线程比较多的时候,系统的开销将会相当大。减少系统开销的一个方法就是使用一个线程池来处理,特别是关于在服务应用程序中使用线程的问题。
在服务器端的应用程序中几乎都采用了“线程池”技术,这主要是为了提高系统效率。因为如果服务器对应每一个请求就创建一个线程的话,在很短的一段时间内就会产生很多创建和销毁线程动作,导致服务器在创建和销毁线程上花费的时间和消耗的系统资源要比花在处理实际的用户请求的时间和资源更多。线程池就是为了尽量减少这种情况的发生。
2、线程池的工作原理
所谓线程池,就是在内存中等待工作的线程,系统会根据工作的情况,自动地创建并管理新的线程。其工作原理如下图所示:
3、ThreadPool类
在.NET中,通过System.Threading.ThreadPool类,每个进程都自动带有一个线程池,而且每个进程至多只能有一个线程池,可以在多个不同的行为间共享线程池。
上面我们已经知道了线程池主要用于服务引入的连接,但同时也还可以周期性地进行其它方面的服务,比如检查服务器上的磁盘空间,确保服务器高速运行,检查电子邮件以及服务客户连接等等。
其实,线程池可以使线程变得更容易,很明显还需要处理同步问题,但我们不需要真实地创建线程,.NET会帮助我们做这些。
这里有一个重要的方法逻辑,既然线程池是.NET封装提供的,那线程内部执行的程序,是怎么样按照申请者的要求而变化的呢?这就要使用委托,我们知道,委托就是向一个方法内部传入一段程序,恰恰可以解决这个问题。
4、WaitCallback 委托
WaitCallback 表示要在 ThreadPool 线程上执行的回调方法。创建委托的基本方法是将回调方法传递给 WaitCallback 构造函数。
通过将 WaitCallback 委托传递给 ThreadPool类中的QueueUserWorkItem()方法来将任务排入线程池队列中以便执行。所传递的回调方法将在某个线程池线程可用时执行。WaitCallback委托的声明如下:
[Serializable] public delegate void WaitCallback( object state);
回调方法的声明必须与 WaitCallback 委托声明具有相同的参数;其中的参数state 包含回调方法要使用的信息的对象。
如果要将信息传递给回调方法,请创建包含所需信息的对象,并在将任务排入队列以便执行时将它传递给 QueueUserWorkItem。每次执行回调方法时,state 参数都包含此对象。
5、QueueUserWorkItem 方法
其功能是将回调方法排入线程池队列以便执行。此方法在有线程池中的线程变得可用时将被自动执行。
WaitCallback s1=new WaitCallback(threadBody);
ThreadPool.QueueUserWorkItem(s1);
6、应用例一
下面做个比较简单的联系,模拟一个服务器工作的应用程序。
(1)构造C#程序的GUI界面
(2)编程按钮的事件响应
(3)执行该程序
注意:完成500个请求,其实只需要38个线程。大大地减少了线程的个数。(4)代码如下:
using System;
using System.Drawing;
using System.Collections;
using ponentModel;
using System.Windows.Forms;
using System.Data;
using System.Threading;
namespace NetThreadPool{
///
/// Form1 的摘要说明。
///
public class Form1 : System.Windows.Forms.Form{
private System.Windows.Forms.Button button1;
private System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.TextBox textBox1;
///
///必需的设计器变量。
///
private ponentModel.Container components = null;
public Form1(){
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
}
///
///清理所有正在使用的资源。
///
protected override void Dispose( bool disposing ){
if( disposing ){
if (components != null) {
components.Dispose();
}