C#通过线程处理接收到的套接字数据

C#通过线程处理接收到的套接字数据,c#,xml,multithreading,sockets,multitasking,C#,Xml,Multithreading,Sockets,Multitasking,我在可伸缩性和处理方面有问题,我想得到堆栈溢出社区的意见 我基本上有来自套接字的XML数据,我想处理这些数据。对于发送的每个XML行,处理可以包括写入文本文件、打开另一台服务器的套接字以及使用各种数据库查询;所有这些都需要时间 目前,我的解决方案涉及以下线程: 线程1 接受传入套接字,从而生成处理每个套接字的子线程(将只有两个来自客户端的传入套接字)。当XML行通过(StreamReader上的ReadLine()方法)时,我基本上会将这一行放入一个队列中,该队列可以通过类上的静态方法访问。这个

我在可伸缩性和处理方面有问题,我想得到堆栈溢出社区的意见

我基本上有来自套接字的XML数据,我想处理这些数据。对于发送的每个XML行,处理可以包括写入文本文件、打开另一台服务器的套接字以及使用各种数据库查询;所有这些都需要时间

目前,我的解决方案涉及以下线程: 线程1 接受传入套接字,从而生成处理每个套接字的子线程(将只有两个来自客户端的传入套接字)。当XML行通过(StreamReader上的ReadLine()方法)时,我基本上会将这一行放入一个队列中,该队列可以通过类上的静态方法访问。这个静态方法包含锁定逻辑,以确保程序是线程安全的(当然,我可以使用并发队列而不是手动锁定)

螺纹2-5 不断地从队列中提取XML行,并一次处理一行(数据库查询、文件写入等)

这种方法似乎很有效,但我很好奇是否有更好的方法,因为这看起来很粗糙。如果我将线程2-5所做的处理带入线程1,这将导致性能极低,这是我所期望的,因此我创建了我的工作线程(2-5)

我很感激我可以用线程池替换线程2-5,但是线程池仍然会从相同的XML行队列中读取,因此我想知道是否有更有效的方法来处理这些事件,而不是使用队列?

队列1是正确的方法。但是我肯定会从手动线程控制转移到线程池(因此我不需要做线程管理),让它管理线程的数量

但最终,一台计算机(无论多么昂贵)只能完成这么多的处理。在某一点上,内存大小、CPU内存带宽、存储IO、网络IO……都将饱和。此时,使用外部队列系统(MSMQ、WebSphere*MQ、Rabbit MQ等),每个任务都是一条单独的消息,允许许多计算机上的许多工作人员处理数据(“竞争消费者”模式)


1我将立即转到
ConcurrentQueue
:正确锁定很难,您不需要自己做的越多越好


2在某些时候,您可能会发现您需要比线程池提供程序更多的控制,这是切换到自定义线程池的时候了。但是原型和测试:很可能您的实现实际上会更糟:参见第2段。

嗨,Richard,谢谢您的回答。我本来打算转移到线程池和ConcurrentQueue。在发布我的初始消息大约半小时后,我发现了消息队列,并开始研究AMQP、STOMP、MSMQ等以及各种程序,如RabbitMQ和ActiveMQ。您是否使用过任何消息队列程序?你会特别推荐吗?@user1593436我已经用过(或者更确切地说是用过其他人的包装纸…)好几次了。但最近没有。考虑到它的集成,我将从MSMQ开始,但希望构建抽象以避免锁定到任何一个抽象中(这也允许通过使用假输入队列进行单元测试)。