3

几年前,我开发了一个服务器应用程序(C#、.NET 4.0),它有多个连接到它的客户端。我这样做的方法是为每个连接创建一个线程,并维护这些连接的列表。当我测试这个应用程序时,它处理了全国 50 个客户的连接。它运行良好(据我所见)。

我的问题是:

  1. 对于可扩展的解决方案,多线程是处理与不同客户端的多个连接的可行解决方案,还是应该在同一个线程上处理所有连接?
  2. .NET 下的线程数和线程数是否有限制?
  3. 在 .NET 中使用线程有缺点吗?

我知道这有点模糊,但自从我前段时间开发这个项目以来,我已经忘记了一些更复杂的细节。我有兴趣为 .NET 中的服务器应用程序开发可扩展的解决方案,并且想从一开始就知道我之前的方法是否有改进的地方。

更新 1

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

在 threadLife 中,我有一个while(true)声明,我在其中等待来自客户端的消息。在此期间,我会等待客户端发送一条消息(所以在我收到消息之前,这段时间被阻塞)

在我的应用程序中,连接非常稳定(即客户端将长时间保持连接),因此连接一直保持活动状态直到客户端断开连接(没有在每条消息后关闭连接,我会收到非常频繁的消息让我知道客户的状态)

4

3 回答 3

2

Thread-per-connection is not a scalable solution.

To scale well, you should use asynchronous socket methods exclusively. The question is whether to multiplex them all on a single thread or to use the thread pool. The thread pool would scale better than multiplexing, but it introduces multithreading complexities.

A lot of devs attempt to learn socket programming and multithreading at the same time, which is just too much.

于 2013-06-21T13:29:02.060 回答
0

one can use message queues, load balancing, dispatching, etc, etc. There is no single answer. Some solutions fit some problems well, some not.

Good places to start can be:

于 2013-06-21T13:30:15.217 回答
0

每个连接一个线程是不可扩展的。

我建议一个线程可以处理一组连接的客户端。如果连接的客户端数量增加,服务器应用程序应该能够添加处理增加所需的线程数。如果事情继续增长,那么其他服务器实例。

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

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

我记得OpenSim项目(一个虚拟世界平台)是这样运行的:每个连接的客户端一个线程。它已经按照上面解释的方式进行了重构。

显然你已经很好地开始使用多线程了。也许这本免费的电子书会帮助您进一步挖掘。

当我开始使用多线程时,起初我很难理解它是指同时多次执行相同的代码,主要是在同一个实例中

于 2013-06-21T15:24:16.823 回答