惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
SegmentFault 最新的问题
N
Netflix TechBlog - Medium
Vercel News
Vercel News
F
Fortinet All Blogs
量子位
博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
MongoDB | Blog
MongoDB | Blog
Y
Y Combinator Blog
GbyAI
GbyAI
博客园 - 三生石上(FineUI控件)
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
月光博客
月光博客
Recent Announcements
Recent Announcements
人人都是产品经理
人人都是产品经理
Hugging Face - Blog
Hugging Face - Blog
D
DataBreaches.Net
H
Help Net Security
阮一峰的网络日志
阮一峰的网络日志
D
Docker
WordPress大学
WordPress大学

博客园 - 李.net

实战小技巧系列(4):WinForm简单步骤制作 实战小技巧系列(4):URL中包含中文参数造成乱码的解决之道 实战小技巧系列(3):服务器端数据初始化到客户端数组中 实战小技巧系列(2):关于IIS6.0中应用程序池圆设置的问题 实战小技巧系列(1):使用索引器解决参数统一解析 关于Castle中AOP的一个问题,急!! - 李.net - 博客园 关于IBatisNet + Castle开发? 关于网站安全性的问题 设计模式杂谈:创建型模式之生成器模式(Builder Pattern) 设计模式杂谈:创建型模式之抽象工厂模式(Abstract Factory) 设计模式杂谈:创建型模式之单件模式(Singleton) 设计模式杂谈:创建型模式之工厂方法(Factory Method) 设计模式杂谈:开头篇 Socket网络编程学习笔记(5):发送和接收实体类数据 Socket网络编程学习笔记(4):TCP消息边界处理 Socket网络编程学习笔记(3):利用套接字助手类 Socket网络编程学习笔记(2):面向连接的Socket Socket网络编程学习笔记(1):常用方法介绍 关于asp.net2.0中添加引用的问题
Socket网络编程学习笔记(6):使用线程池提高性能
李.net · 2006-10-30 · via 博客园 - 李.net

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