C# 在可扩展的客户机-服务器应用程序上执行多线程或不执行多线程

C# 在可扩展的客户机-服务器应用程序上执行多线程或不执行多线程,c#,.net,sockets,C#,.net,Sockets,几年前,我开发了一个服务器应用程序(C#,.NET4.0),它有多个连接到它的客户端。我这样做的方式是为每个连接创建一个线程,并维护这些连接的列表。当我测试这个应用程序时,它处理了全国50个客户端的连接。它运行正常(从我看到的) 我的问题是: 对于一个可扩展的解决方案,多线程是处理多个客户端连接的可行解决方案,还是应该处理同一线程上的所有连接 NET下的线程数和线程数是否有限制 在.NET中使用线程有缺点吗 我知道这有点含糊不清,但我已经忘记了一些更复杂的细节,因为我开发的项目前一段时间。我对为

几年前,我开发了一个服务器应用程序(C#,.NET4.0),它有多个连接到它的客户端。我这样做的方式是为每个连接创建一个线程,并维护这些连接的列表。当我测试这个应用程序时,它处理了全国50个客户端的连接。它运行正常(从我看到的)

我的问题是:

  • 对于一个可扩展的解决方案,多线程是处理多个客户端连接的可行解决方案,还是应该处理同一线程上的所有连接
  • NET下的线程数和线程数是否有限制
  • 在.NET中使用线程有缺点吗 我知道这有点含糊不清,但我已经忘记了一些更复杂的细节,因为我开发的项目前一段时间。我对为.NET中的服务器应用程序开发一个可扩展的解决方案很感兴趣,我想从一开始就知道我的方法在哪些方面需要改进

    更新1

    我没有使用线程轮询实例化。我实际上为一个方法创建了一个线程(我们称之为方法threadLife)

    在threadLife中,我有一个
    while(true)
    语句,在该语句中我等待来自客户端的消息。在while中,我会等待客户端发送消息(因此while被阻止,直到我收到消息)


    在我的应用程序中,连接非常稳定(即客户端将保持连接很长一段时间),因此在客户端断开连接之前,连接一直保持活动状态(不是在每条消息之后关闭连接,我会收到非常频繁的消息,让我知道客户端的状态)每个连接的线程不是可扩展的解决方案

    为了更好地扩展,应该专门使用异步套接字方法。问题是,是在单个线程上多路复用它们,还是使用线程池。线程池的可扩展性比多路复用要好,但它引入了多线程复杂性


    许多开发人员试图同时学习套接字编程和多线程,这太多了。

    人们可以使用消息队列、负载平衡、调度等。没有单一的答案。有些解决方案很适合某些问题,有些则不适合

    好的起点可以是:

    • 文件

    每个连接一个线程将无法扩展

    我建议线程可以处理一组连接的客户端。如果连接的客户端数量增加,服务器应用程序应该能够添加处理爬升所需的线程。如果情况继续发展,则需要其他服务器实例

    与其让线程做所有事情(就像应用程序实例所做的那样),不如让一些专用线程单独处理同一任务,并以同步方式共享内存中的数据

    这就是IIS的工作方式。工作进程数、线程数和线程池可通过控制面板进行管理

    我记得这个项目(一个虚拟世界平台)是这样运行的:每个连接的客户端一个线程。自上述方式以来,它已被重构

    显然,您已经在多线程方面有了良好的开端。也许这会帮助你进一步挖掘


    当我启动多线程时,一开始我很难理解它意味着同时执行同一代码,主要是在同一个实例中执行多线程是的。每个客户端/连接的线程数,否。您可以使用线程池,它将为您处理线程数!客户端如何连接到服务器?如何为每个连接分配一个线程,是否有一个服务器线程轮询端口或其他什么?它们是循环还是阻塞?为每个线程绑定一个线程是浪费的,即使它们确实阻塞了调度器需要检查的线程,并且占用了内存。最好从任务的角度考虑,让TPL/线程池处理te并行性/并发性。@gjvdkamp查看更新1了解更多信息。谢谢我以前没有使用过threadpolling,我在大学时做过这个项目,所以我使用了where认为的基础知识。你能告诉我我的方法有什么问题吗?嗯。。。不太清楚你在这里做了什么。。如果我要做这样一个应用,我会使用WCF,你知道吗?这样,您就可以从客户端调用服务器,而不必在封面下面详细说明如何处理。(如果愿意,可以这样做,但默认设置非常聪明)。这将利用线程池将调用分配给线程,而无需担心。关于线程池,它所做的只是回收旧线程,还是将多个任务分配给同一线程?i、 e.如果1000个客户端同时连接到新启动的服务器,线程池是创建1000个线程,还是创建较少数量的线程来添加连接?线程池仅在需要时通过爬山算法添加线程,并且支持每个线程的多个任务。