C# 在可扩展的客户机-服务器应用程序上执行多线程或不执行多线程
几年前,我开发了一个服务器应用程序(C#,.NET4.0),它有多个连接到它的客户端。我这样做的方式是为每个连接创建一个线程,并维护这些连接的列表。当我测试这个应用程序时,它处理了全国50个客户端的连接。它运行正常(从我看到的) 我的问题是:C# 在可扩展的客户机-服务器应用程序上执行多线程或不执行多线程,c#,.net,sockets,C#,.net,Sockets,几年前,我开发了一个服务器应用程序(C#,.NET4.0),它有多个连接到它的客户端。我这样做的方式是为每个连接创建一个线程,并维护这些连接的列表。当我测试这个应用程序时,它处理了全国50个客户端的连接。它运行正常(从我看到的) 我的问题是: 对于一个可扩展的解决方案,多线程是处理多个客户端连接的可行解决方案,还是应该处理同一线程上的所有连接 NET下的线程数和线程数是否有限制 在.NET中使用线程有缺点吗 我知道这有点含糊不清,但我已经忘记了一些更复杂的细节,因为我开发的项目前一段时间。我对为
while(true)
语句,在该语句中我等待来自客户端的消息。在while中,我会等待客户端发送消息(因此while被阻止,直到我收到消息)
在我的应用程序中,连接非常稳定(即客户端将保持连接很长一段时间),因此在客户端断开连接之前,连接一直保持活动状态(不是在每条消息之后关闭连接,我会收到非常频繁的消息,让我知道客户端的状态)每个连接的线程不是可扩展的解决方案 为了更好地扩展,应该专门使用异步套接字方法。问题是,是在单个线程上多路复用它们,还是使用线程池。线程池的可扩展性比多路复用要好,但它引入了多线程复杂性
许多开发人员试图同时学习套接字编程和多线程,这太多了。人们可以使用消息队列、负载平衡、调度等。没有单一的答案。有些解决方案很适合某些问题,有些则不适合 好的起点可以是:
- 文件
当我启动多线程时,一开始我很难理解它意味着同时执行同一代码,主要是在同一个实例中执行多线程是的。每个客户端/连接的线程数,否。您可以使用线程池,它将为您处理线程数!客户端如何连接到服务器?如何为每个连接分配一个线程,是否有一个服务器线程轮询端口或其他什么?它们是循环还是阻塞?为每个线程绑定一个线程是浪费的,即使它们确实阻塞了调度器需要检查的线程,并且占用了内存。最好从任务的角度考虑,让TPL/线程池处理te并行性/并发性。@gjvdkamp查看更新1了解更多信息。谢谢我以前没有使用过threadpolling,我在大学时做过这个项目,所以我使用了where认为的基础知识。你能告诉我我的方法有什么问题吗?嗯。。。不太清楚你在这里做了什么。。如果我要做这样一个应用,我会使用WCF,你知道吗?这样,您就可以从客户端调用服务器,而不必在封面下面详细说明如何处理。(如果愿意,可以这样做,但默认设置非常聪明)。这将利用线程池将调用分配给线程,而无需担心。关于线程池,它所做的只是回收旧线程,还是将多个任务分配给同一线程?i、 e.如果1000个客户端同时连接到新启动的服务器,线程池是创建1000个线程,还是创建较少数量的线程来添加连接?线程池仅在需要时通过爬山算法添加线程,并且支持每个线程的多个任务。