在你的表述中,“线程池不适合用来做耗时的任务”是最大误区
1)你一定看到过System.Net.Socket类中有很多BeginXXX / EndXXX的方法,例如Socket.BeginReceiveFrom和Socket.EndReceiveFrom,这些函数统称为异步函数。而异步函数操作的基础恰恰就是线程池。对Socket通信而言,微软提供的异步操作正是利用线程池中I/O线程,目的就是为了提高Socket I/O性能并简化内存管理的!
2)如果对异步操作感到头晕,在处理Socket操作时可以使用“显式线程”方法,即按以下方法启动处理线程:
System.Thread t = new System.Thread(你的处理函数);
t.IsBackground = true; //这个设置尤其重要!!!!!
t.Start();
一定要注意将线程设置为后台线程!
3)你一定知道系统每次启动线程和销毁线程时都会导致很大的开销。当你的程序频繁的启动、销毁线程,必然会导致程序很“卡”;正是由于这个缘故,微软才搞了一个“线程池”。因为线程中的线程都是“启动完毕的”(这样表述虽不确切,但没有错),一旦你将异步处理函数“挂接”的线程池中的空闲线程上即可以执行你要的操作。而且,额外的好处是你根本不用去管理线程池中的线程(真正的“零”管理)
4)处理“耗时的操作”特别是涉及诸如Socket I/O 耗时操作,最佳的处理方法是利用后台线程(如果需要,同时配合以自定义事件event),这是增加用户体验不二法门哦~~
Windows下参考完全端口,也叫iocp;Linux下参见Epoll
你的问题涉及很多方面。帮你清理一下,
socket 的追踪问题,没法准确判断连接是否已经断开,今天技术问题很容易解决。
多线程问题,每个客户端连接过来的时候都需要开辟一个新的线程去处理客户发来的消息。
耗时的任务, 感觉关键在于耗时的任务,因为耗时的线程确实会很快消耗掉所有的线程池。
首先,耗时是什么造成的,如果是硬盘读写,能否用cache解决?如果是网络问题,能否call back? 如果是数据库问题,能否用cluster?如果是CPU问题,能否采用web farm?