2011-06-13 74 views
3

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

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

我假设有一个更好的方法来做到这一点...任何建议?

谢谢。

回答

4

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

0

.NET ThreadPool比这更聪明。我建议使用Task/TaskScheduler框架或相关FCL类的APM模型。这几乎肯定会优于任何手动线程产卵策略 - 除非你想出了一个beats'em所有...

0

我强烈推荐this视频,杰弗里·里希特给出了一个关于一般多线程和线程池的讨论。他还提到了服务器多线程的最佳策略