C# 线程池和带有while(true)循环的方法?

C# 线程池和带有while(true)循环的方法?,c#,multithreading,network-programming,C#,Multithreading,Network Programming,ThreadPool利用线程的循环来实现最佳性能,而不是使用多个Thread类。但是,这如何应用于线程池中带有while循环的处理方法 例如,如果要将线程池中的线程应用于已连接到TCP服务器的客户端,则该客户端将需要一个while循环来不断检查传入数据。可以退出循环以断开客户端的连接,但仅当服务器关闭或客户端要求断开连接时 如果是这样的话,那么当大量客户机连接时,线程池又有什么帮助呢?无论哪种方式,如果客户端保持连接,将使用相同数量的内存。如果它们保持连接,则线程无法回收。如果是这样,那么线程池

ThreadPool利用线程的循环来实现最佳性能,而不是使用多个Thread类。但是,这如何应用于线程池中带有while循环的处理方法

例如,如果要将线程池中的线程应用于已连接到TCP服务器的客户端,则该客户端将需要一个while循环来不断检查传入数据。可以退出循环以断开客户端的连接,但仅当服务器关闭或客户端要求断开连接时

如果是这样的话,那么当大量客户机连接时,线程池又有什么帮助呢?无论哪种方式,如果客户端保持连接,将使用相同数量的内存。如果它们保持连接,则线程无法回收。如果是这样,那么线程池将不会有多大帮助,直到客户端断开连接并打开一个线程进行回收

另一方面,有人建议我使用Network.BeginReceive和NetworkStream.EndReceive异步方法来避免所有线程一起使用,以节省RAM使用和CPU使用。这是真的还是假的

无论哪种方式,如果客户端保持不变,将使用相同数量的内存 连接

到目前为止,这是事实。由应用程序决定每个客户端需要保持多少状态

如果它们保持连接,则线程无法回收。如果是,, 然后,线程池将不会有多大帮助,直到客户端断开连接并 打开要回收的线程

这是不真实的,因为它假定这些线程执行的所有有趣的操作都是同步的。这是一种幼稚的操作模式,事实上,真实世界的代码是异步的:线程调用请求操作,然后可以自由地执行其他操作。当某个结果作为该操作的结果可用时,一些寻找其他操作的线程将运行作用于该结果的代码

另一方面,有人建议我使用 Network.BeginReceive和NetworkStream.EndReceive异步方法 避免所有线程一起使用,以节省RAM使用和CPU使用。这是吗 是不是

如上所述,像这样的异步方法将允许您使用少量的工作线程为可能非常多的客户机提供服务,但它本身不会对内存状况产生任何帮助或影响

无论哪种方式,如果客户端保持不变,将使用相同数量的内存 连接

到目前为止,这是事实。由应用程序决定每个客户端需要保持多少状态

如果它们保持连接,则线程无法回收。如果是,, 然后,线程池将不会有多大帮助,直到客户端断开连接并 打开要回收的线程

这是不真实的,因为它假定这些线程执行的所有有趣的操作都是同步的。这是一种幼稚的操作模式,事实上,真实世界的代码是异步的:线程调用请求操作,然后可以自由地执行其他操作。当某个结果作为该操作的结果可用时,一些寻找其他操作的线程将运行作用于该结果的代码

另一方面,有人建议我使用 Network.BeginReceive和NetworkStream.EndReceive异步方法 避免所有线程一起使用,以节省RAM使用和CPU使用。这是吗 是不是


如上所述,像这样的异步方法将允许您使用少量的工作线程为可能非常多的客户机提供服务,但它本身不会对内存状况产生任何帮助或影响。

您是正确的。缓慢的阻塞代码可能会导致客户端和服务器端的性能不佳。您可以在一个单独的线程上运行慢速工作,这在客户端可能工作得很好,但在服务器端可能没有帮助。在服务器中使用阻塞方法可能会降低服务器的整体性能,因为这可能会导致服务器运行大量线程,并且所有线程都被阻塞。因此,即使是简单的请求也可能会花费很长时间。如果异步API适用于运行缓慢的任务(就像您所处的情况一样),则最好使用异步API。(注意:即使异步操作不可用,您也可以通过实现自定义等待器类来实现异步操作)这对客户端和服务器都更好。异步代码的要点是减少线程数。因为服务器可以同时处理更多的请求,因为减少处理特定数量客户端的线程数量可以提高可伸缩性

如果您不需要对线程或线程池有更多的控制,您可以使用异步方法


此外,每个线程占用堆上的1MB空间。因此,异步方法肯定有助于减少内存使用。然而,我认为您在这里描述的工作性质在多线程和异步方法中所花费的时间几乎相同

你说得对。缓慢的阻塞代码可能会导致客户端和服务器端的性能不佳。您可以在一个单独的线程上运行慢速工作,这在客户端可能工作得很好,但在服务器端可能没有帮助。在服务器中使用阻塞方法可能会降低服务器的整体性能,因为这可能会导致服务器运行大量线程,并且所有线程都被阻塞。因此,即使是简单的请求也可能会花费很长时间。如果异步API适用于运行缓慢的任务(就像您所处的情况一样),则最好使用异步API。(注意:即使异步操作不可用,您也可以通过实现自定义等待器类来实现异步操作)这对客户端和服务器都更好。异步代码的要点是减少线程数。因为服务器可以有更多的正在进行的simu请求