好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

c#的ThreadPool使用笔记(一)

c#的ThreadPool使用笔记(一)

摘要:
系列文章,从一个基本的代码说起,逐步探索 ThreadPool 的奥妙。

首先,看看线程池的样子:

从上图看出,线程池维护1个至n个线程,操作系统从请求队列中提取请求分配个线程池中的适合线程处理。

先写下如下的代码:

using  System;
using  System.Threading;

public   class  ThreadBase
{
     public   static   void  Main ( )  {

        System.Threading.WaitCallback waitCallback  =   new  WaitCallback ( MyThreadWork );

        ThreadPool.QueueUserWorkItem ( waitCallback,  " 第一个线程 "  );
        ThreadPool.QueueUserWorkItem ( waitCallback,  " 第二个线程 "  );
        ThreadPool.QueueUserWorkItem ( waitCallback,  " 第三个线程 "  );
        ThreadPool.QueueUserWorkItem ( waitCallback,  " 第四个线程 "  );
        Console.ReadLine ( );
    }

     public   static   void  MyThreadWork (  object  state )  {
        Console.WriteLine (  " 线程现在开始启动…… {0} " ,( string )state );
        Thread.Sleep (  10000  );
        Console.WriteLine (  " 运行结束…… {0} " ,(  string  ) state );
    }
}

分析上面的代码:
一、首先定义了一个 System.Threading.WaitCallback 对象 waitCallback。  
WaitCallback 是一个委托,表示线程池线程要执行的回调方法,它的原型如下:

[ComVisibleAttribute( true )] 
public   delegate   void  WaitCallback (
    Object state
)

1、这里有一个 Callback 机制的问题,所谓的Callback 简单的理解就是由操作系统调用的函数,我们自己写的程序不需要调用。就像有个修理工到家里搞修理,你只需要告诉他钳子、螺丝刀、胶布等修理工具在什么地方就行,而不要管他在什么时候、在什么地方怎样使用这些修理工具。
2、WaitCallback 的参数" Object state",这个参数包含回调方法要使用的信息的对象。在接下来的情况中我再说。
既然 WaitCallback 委托的原型如此,那么我们就申明一个跟它的样子差不多的函数,这个函数就是要线程做的事情。

public   static    void  MyThreadWork (  object  state )


这里函数中多了一个 "static",这是因为Main的关系(更大一点就是因为C#语言机制的问题),如果WaitCallback 的对象不是在静态(static)方法中,这个static 是不需要的。

二、接着就是要执行的方法放入线程池中,以便操作系统执行。
我这里放置了四个方法要操作系统执行:

        ThreadPool.QueueUserWorkItem ( waitCallback,  " 第一个线程 "  );
        ThreadPool.QueueUserWorkItem ( waitCallback,  " 第二个线程 "  );
        ThreadPool.QueueUserWorkItem ( waitCallback,  " 第三个线程 "  );
        ThreadPool.QueueUserWorkItem ( waitCallback,  " 第四个线程 "  );

这里,我放置到线程池中的操作是一样的,当然也可以不一样,接下来说。

三、最后阻塞主线程,等待线程池中的线程执行

 Console.ReadLine ( );

如果忽略掉这个代码,则有可能看不到任何输出

好了,这是主线程做的事情了,接下来看看线程池中的线程做的事情。
这个很简单,就是将线程的参数输出,然后线程睡眠(sleep)一段时间,最后输出线程结束的信息。

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于c#的ThreadPool使用笔记(一)的详细内容...

  阅读:38次