Socket网络编程学习笔记(6):使用线程池提高性能

时间:2022-09-16 19:41:46

      在前几篇介绍中,不论是服务端的侦听还是客户端的连接都是通过新建一个线程去执行特定功能的。在这种情况下,一量有一个新客户端需要连接,则又得创建新的线程,而当程序创建新线程时,往往需要大量的内部开销,这对程序的性能有一定的影响。在.NET库中提供了一种方法,可以避免一些开销。而在Socket通讯中还有另一种访求那就是异步Socket,我不知道用这种方式的性能如何,在这里且不管这种形式,主要来看一下用线程池解决问题。

      Windows操作系允许用户维持一池“预先建立的”线程,这个线程池为应用程序中指定的方法提供工作线索。一个线程控制线程池的操作,并用应用程序可以分配附加的线程进行处理。在默认情况下,在线程池中有25个预处理线程,用这种方式可以满足一些小应用。

      如果要为线程池中的线程注册一个代表,则用下面的格式:

      ThreadPool.QueueUserWorkItem(new WaitCallback(Counter));
      
      其中QueueUserWorkItem是ThreadPool类的一个静态方法;而Counter参数代表运行在线程中的方法,在这要注意的是该Counter方法必须包含一个object 参数,这个在下面的例子中有体现;另外,处Thread对象不一样,代表一旦放置在线程池查询中上,将被处理,不需要其他的方法启动该项工作;当主程序线程退出,所有的线程池线程都将终止,主线程不会等待线程池线程结束。

      下面我们来看看怎么样运用到我上面讲的例子中去:

      原有线程调用:

      clientThread = new Thread(new ThreadStart(ReceiveData));
      clientThread.Start();

      用线程池只要一句就可以了:

      ThreadPool.QueueUserWorkItem(new WaitCallback(ReceiveData));

      其它具体的请下载源码。

      源码下载:/Files/licongjie/SocketTest3.rar