日期:2014-05-17  浏览次数:21272 次

一个电脑最多能开启多少个线程?
比如:服务器上运行一C#的winForm程序.

Socket方面的 如果有连接就创建一个线程



var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(new IPEndPoint(IPAddress.Any, int.Parse(txt_port.Text)));
socket.Listen(10000);//不知道是干啥的 就写10000了
socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);


所以在每次有连接的时候 都走了ClientAccepted然后会默认开个线程..

如果2003系统4G内存 最高可以有多少个连接?跟CPU有关系吗?

是不是电脑的线程没了 就死机了?

------解决方案--------------------
ClientAccepted里也用socket异步接收,没必要每个连接开一个线程,浪费资源。
另外32位的系统,我测试过每个进程可以开1800-1900多个线程封顶。超过后,其他线程都会处于等待状态,不会运行,直到有运行的线程退出。
我之前做过一个采集的项目,下位机设备会主动TCP连接服务器,用socket异步可以保持1W多个TCP连接,如果你每个连接开一个线程,那么你能保持的TCP连接数受到线程数影响,只能不到2000个
------解决方案--------------------
socket.Listen(10000);//不知道是干啥的 就写10000了
看方法说明啊
BeginAccept并不是你想的那样执行一次开一个线程,实际情况是bind一个线程池线程,异步执行完后
会放回线程池,池内会保持几个(默认与CPU数量有关)空闲线程活动(减小频繁创建-销毁线程的开销)
池最大可运行的线程数量,可以通过System.Threading.ThreadPool.GetMaxThreads获取,相应地还有个Set方法,
一般情况不需要考虑最大数量(真到那时候加服务器吧),有些情况通过设置最少活动线程SetMinThreads来提高性能