licongjie的博客

专心、专注、专业
随笔 - 26, 文章 - 1, 评论 - 214, 引用 - 12
数据加载中……

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

      在前几篇介绍中,不论是服务端的侦听还是客户端的连接都是通过新建一个线程去执行特定功能的。在这种情况下,一量有一个新客户端需要连接,则又得创建新的线程,而当程序创建新线程时,往往需要大量的内部开销,这对程序的性能有一定的影响。在.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

posted on 2006-10-30 17:10 李.net 阅读(4339) 评论(14)  编辑 收藏 网摘 所属分类: Socket编程

评论

#1楼   回复  引用    

先收藏一下
2006-10-30 19:11 | wenjie[匿名][未注册用户]

#2楼   回复  引用  查看    

老兄,你这个系列总共是几讲!
我可是一直在看,就怕哪天断了
2006-10-30 21:00 | 深夜醉猫      

#3楼   回复  引用  查看    

呵呵,我也是啊
2006-10-31 08:35 | 兰亭      

#4楼   回复  引用    

你可以到我的网站上看看那个反向代理,它就是用C#做的,全部使用异步,我没有拿它和同步多线程对比过,不过大请求工作的时候,它用到的线程并不多。遗憾的是,我编程功底不够,程序不怎么稳定

#5楼[楼主]   回复  引用  查看    

@深夜醉猫
就到这里结束了,这算是我的学习笔记了,主要指面向对象的连接,至于那些UDP以及IP组播、邮件应用等就不再讲述了。呵呵,谢谢关注
2006-10-31 09:34 | 李.net      

#6楼[楼主]   回复  引用  查看    

@大石头[匿名]
我也差不多,不过多写了就会有收获
2006-10-31 09:35 | 李.net      

#7楼   回复  引用    

这个线程池并不好用,当访问量比较大且持续不断时候,效果并不好,垃圾回收好象存在问题,容易导致outofmemoryException .
2006-10-31 10:44 | tian[未注册用户]

#8楼[楼主]   回复  引用  查看    

@tian
是的,这个不适合于那些有大量连接的应用,但对于一些小应用我想是足够了,毕竟已经有25个已经在了,还有线程池能够统一管理这些线程,也可以少了人工的去管理,比较方便
2006-10-31 17:48 | 李.net      

#9楼   回复  引用    

老兄太牛啦!!!关注中!!
2006-12-03 18:26 | dg[未注册用户]

#10楼   回复  引用  查看    

To tian ,

访问量大的时候,没有内存分配,会发生outofmemoryException,请问你有更好的方法吗?
2007-01-30 17:54 | 海纳百川      

#11楼   回复  引用    

你好,我想问一下,如过我是在SOCKET里使用的线程池来处理文件的发送,当其中的一个客户端关闭的时候,它提示远程主机强迫关闭了一个现有的连接应该如何处理线程池中的某一个连接事件好呢。
2007-02-06 14:59 | silnfeng[未注册用户]

#12楼   回复  引用    

或者你能不能讲一下线程池的收尾工作,怎么排队一下响应的连接,怎么关闭。
2007-02-06 15:24 | silnfeng[未注册用户]

#13楼   回复  引用    

public static void GetMaxThreads (
out int workerThreads,
out int completionPortThreads
)
bool flag = ThreadPool.SetMaxThreads(1,1);
flag:false;
我调用这个方法设置线城池大小的时候返回FALSE
为什么呢
2007-08-10 10:03 | square[未注册用户]

#14楼   回复  引用  查看    

lz的笔记写的太好了,强烈要求多写,为博客园造福。
我也是一直看到这篇的,虽然自己不是很懂,但安书上说的,线程池解决了系统在线程创建上的时间的开销,还可以再用上异步的技术,它解决了在多线程,长时间任务的开销,这样系统应该会更稳定的很多。
不知道说的对不对,望lz赐教。
2008-08-05 19:26 | KKcat      



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 544638




相关文章:

相关链接: