我有一个非常简单的问题,也许熟悉服务器/客户端设计和 .NET 异步 I/O 范例的人可以快速回答...
我正在编写一个服务器端应用程序,该应用程序设计为在相对不复杂的硬件上运行(阅读:不太现代的普通办公室台式电脑),但可以容纳相当多的用户(尽管有些用户可能是空闲的) - 因此,我担心每个客户端都有一个线程对可伸缩性的影响(由于过多的上下文切换导致机器停止运行)。当然,这需要仔细考虑何时真正应该生成线程。
我考虑过的一个解决方案是在服务器应用程序中有一个主线程(与连接监听器线程分开),它通过定期查看打开的套接字列表并执行 select(.. 。) 在各个。如果线程发现传入数据,它会设置异步读取(以使用消息、处理消息并返回回复(如果需要)),然后移动到下一个套接字。无论服务器至少有一个客户端连接多久,都会重复此过程。
这样做时,实际运行的最大线程数仅限于实际通信的客户端数量(并且永远不会高于最大连接用户数);对于空闲的客户端,不存在空闲线程,它只是占用 CPU 并使机器陷入困境 - 线程与客户端关联的唯一时间是当有实际数据需要接收和处理时。
在我看来,这是有道理的,尽管我想这是我第一次在 C# 中尝试这种方式。有没有人对这可能带来的任何问题有任何想法,或者对完成相同任务的更好方法有什么建议?
谢谢!
最佳答案
您可能需要考虑的一种方法是使用 ThreadPool为您的应用程序提供一个可用线程池。
这种方法与您正在考虑的方法不同,因为您的服务器可以同时处理固定数量的线程,超过该数量后收到的任何请求都将排队,直到另一个工作线程可用.
事实上,这就是 ASP.NET 用于传入 HTTP 请求的内容。
关于c# - .NET 客户端/服务器可扩展性和异步 I/O - 过多线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1695313/