C#服务器线程分配

C#服务器线程分配,c#,.net,multithreading,sockets,C#,.net,Multithreading,Sockets,我正在编写一个需要为大量客户机服务的服务器。我在考虑什么是最好的线程策略:我读到.NET Framework上的ThreadPool类在考虑了机器运行的内核数量等参数后分配线程,这非常好。但是,如果没有可用线程,它将等待一个线程变为可用线程 我的套接字上的连接可能相当长,也就是说,一个线程在为其客户端提供服务并终止之前可能会运行相当长的一段时间。因此,如果我为每个套接字启动一个新线程,理论上可能会有大量线程处于空闲状态(等待套接字上的数据),但仍被视为正在运行,从而阻止线程池分配新线程并服务于其

我正在编写一个需要为大量客户机服务的服务器。我在考虑什么是最好的线程策略:我读到.NET Framework上的
ThreadPool
类在考虑了机器运行的内核数量等参数后分配线程,这非常好。但是,如果没有可用线程,它将等待一个线程变为可用线程

我的套接字上的连接可能相当长,也就是说,一个线程在为其客户端提供服务并终止之前可能会运行相当长的一段时间。因此,如果我为每个套接字启动一个新线程,理论上可能会有大量线程处于空闲状态(等待套接字上的数据),但仍被视为正在运行,从而阻止
线程池
分配新线程并服务于其他客户端。另一方面,使用预定义数量的线程服务于所有套接字并不能最佳地利用机器的多核

我想有更好的方法来做到这一点。。。有什么建议吗


谢谢。

不要自己分配线程。使用IIS或Windows Process Activation Service:

您要使用的。它们使用线程池,但在等待套接字上的数据时不使用线程(即,它们是非阻塞的)。

而.NET
线程池
要比这聪明得多。我建议使用
Task/TaskScheduler
框架或相关FCL类的APM模型。这几乎肯定比任何手动线程生成策略都要好——除非你能想出一个比它们都好的策略……

我强烈推荐视频,Jeffrey Richter介绍了一般的多线程和线程池。他还提到了服务器多线程的最佳策略