C#服务器线程分配

本文关键字:分配 线程 服务器 | 更新日期: 2023-09-27 17:59:08

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

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

我想有更好的方法。。。有什么建议吗?

谢谢。

C#服务器线程分配

您希望使用异步套接字。它们利用线程池,但在等待套接字上的数据时不会用完线程(即,它们是非阻塞的)。

不要自己分配线程。使用IIS或Windows Process Activation Service:http://msdn.microsoft.com/en-us/library/ms733109.aspx

.NET ThreadPool比这聪明得多。我建议使用Task/TaskScheduler框架或相关FCL类的APM模型。这几乎肯定会优于任何手动线程生成策略——除非你想出一个能打败所有线程的策略。。。

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