c# - .NET 客户端/服务器可扩展性和异步 I/O - 过多线程问题

标签 c# .net asynchronous scalability client-server

我有一个非常简单的问题,也许熟悉服务器/客户端设计和 .NET 异步 I/O 范例的人可以快速回答...

我正在编写一个服务器端应用程序,该应用程序设计为在相对不复杂的硬件上运行(阅读:不太现代的普通办公室台式电脑),但可以容纳相当多的用户(尽管有些用户可能是空闲的) - 因此,我担心每个客户端都有一个线程对可伸缩性的影响(由于过多的上下文切换导致机器停止运行)。当然,这需要仔细考虑何时真正应该生成线程。

我考虑过的一个解决方案是在服务器应用程序中有一个主线程(与连接监听器线程分开),它通过定期查看打开的套接字列表并执行 select(.. 。) 在各个。如果线程发现传入数据,它会设置异步读取(以使用消息、处理消息并返回回复(如果需要)),然后移动到下一个套接字。无论服务器至少有一个客户端连接多久,都会重复此过程。

这样做时,实际运行的最大线程数仅限于实际通信的客户端数量(并且永远不会高于最大连接用户数);对于空闲的客户端,不存在空闲线程,它只是占用 CPU 并使机器陷入困境 - 线程与客户端关联的唯一时间是当有实际数据需要接收和处理时。

在我看来,这是有道理的,尽管我想这是我第一次在 C# 中尝试这种方式。有没有人对这可能带来的任何问题有任何想法,或者对完成相同任务的更好方法有什么建议?

谢谢!

最佳答案

您可能需要考虑的一种方法是使用 ThreadPool为您的应用程序提供一个可用线程池。

这种方法与您正在考虑的方法不同,因为您的服务器可以同时处理固定数量的线程,超过该数量后收到的任何请求都将排队,直到另一个工作线程可用.

事实上,这就是 ASP.NET 用于传入 HTTP 请求的内容。

关于c# - .NET 客户端/服务器可扩展性和异步 I/O - 过多线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1695313/

相关文章:

c# - 在 ASP.net MVC 中显示没有 Controller 或操作的文件夹中的 View

c# - 如何在 Simple Injector 中创建 Tagged Litetimes?

c# - .NET 单位类,英寸到毫米

c# - 在本地访问 Azure Key Vault 'secrets' 以获取环境变量 - C#

c# - 从基类实例自动创建子类实例

c# - 在内存方面,将字符串存储为字节是否比其等效的 UTF 更便宜?

java - Java/Tomcat 中的异步方法

c# - 使用区域和 Controller 名称进行路由(asp.net core)

javascript - 如何从包装函数返回 javascript ajax 调用的结果?

firebase - 异步 new Vue() 等待初始身份验证