最近我一直在阅读关于线程的文章,因为我想开发一个高性能、可扩展的TCP服务器,可以处理高达10,000-20,000个客户端,并且每个客户端都会与服务器进行双向通信,使用基于命令的系统。服务器将接收到命令,并根据命令执行单个(或多个)任务。我的问题是如何适当地利用.NET线程构造函数处理各种情况,执行可能需要1分钟到数小时不等的任务,这取决于所执行的工作。
最混乱的是,无论我读到哪里,都会看到类似于“使用手动创建的线程(或自定义线程池)来处理“长时间运行”的任务,并使用TPL处理短期任务,或需要并行处理的任务。” 什么是“长时间运行”的任务呢?是5秒、60秒还是一个小时?
在使用以下三种方法创建线程的时间范围内,我应该使用哪种方法:
- 手动创建的线程
- .NET ThreadPool 类
- TPL
我考虑的另一个问题是——假设我的服务器实际上连接了20,000个客户端,每个客户端每秒发送1个命令(可能转换为一个或多个任务)。即使使用强大的硬件,我是否有可能将过高的工作负载推入我的线程池/工作项队列中,因此最终会在队列慢慢填充到最大值后生成OutOfMemoryException?
任何见解都将不胜感激。