0

我目前正在创建一个服务器类型的应用程序,它将通常监听来自外部客户端的连接,并在它们连接时处理请求等。

目前,每次客户端连接时,我的实现都会创建一对线程。一个线程简单地从套接字读取请求并将它们添加到队列中,第二个线程从队列中读取请求并处理它们。

我基本上是在寻找关于你是否认为拥有所有这些线程是矫枉过正的意见,重要的是这种方法是否会给我带来问题。

需要注意的是,这些线程大部分时间都是空闲的——我在两个线程中都使用了等待句柄(ManualResetEvent)。Reader 线程一直等到消息可用,如果可用,则读取它并将其转储到 Process 线程的队列中。Process 线程一直等待,直到阅读器发出消息在队列中的信号(同样,使用等待句柄)。除非某个特定的客户端真的在敲击服务器,否则这些线程将一直处于等待状态。这很昂贵吗?

我做了一些测试 - 有 1,000 个客户端连接不断唠叨 - 服务器(所以,2,000 多个线程),它似乎处理得很好。

4

2 回答 2

1

我认为您的实施存在缺陷。这种设计无法扩展,因为创建线程的成本很高,而且可以创建的线程数量是有限的。这就是大多数这种类型的实现都使用线程池的原因。这使得在工作完成时轻松管理新连接和重用线程的同时,可以轻松限制最大线程数量。

如果您对线程所做的只是将项目放入队列中,则使用该 ThreadPool.QueueUserWorkItem方法使用默认的 .NET 线程池。

您在问题中没有提供足够的信息来明确指定,但也许您现在只需要一个其他线程,不断运行清理队列,您可以使用等待句柄来发出信号,何时添加了某些内容。

只需确保同步对队列的访问,否则会出现严重错误。

于 2010-03-03T15:18:49.117 回答
0

我建议使用以下模式。首先,您需要线程池 - 内置或自定义。有一个线程检查是否有可读取的内容,如果是,它会选择 Reader 线程。然后读取线程放入队列,然后从处理线程池中选择它。它将最小化线程数并最小化等待状态的时间

于 2010-03-03T15:15:56.287 回答