C#1套接字客户端连续数据

时间:2011-03-08 15:09:44

标签: c# sockets

我正在编写一个连接到单个套接字的服务,然后读取连续且有时很多的数据。然后我收到的数据应交给另一个线程(在服务中)进行处理,原因是处理可能需要一段时间,我不想阻止接收套接字。

我打算使用Begin或Async接收方法来处理数据,而不是让线程运行读取并发队列或其他东西。我需要这个扩展到可能通过套接字的大量数据。有什么建议?

2 个答案:

答案 0 :(得分:5)

我不确定使用异步接收如何帮助处理。据我所知,你将有一个连接到套接字的线程并读取连续的数据流。我假设线程可以将连续流分解为某种记录,或者至少是可管理大小的块。然后,您必须将该数据提供给一个或多个处理线程。

我强烈建议您使用并发队列(实际上是BlockingCollection)在正在读取数据的线程与将要执行处理的线程之间进行通信。我建议使用BlockingCollection有几个原因:

  • 它易于使用 - 没有明确的锁定代码
  • 非繁忙等待
  • 有效处理N个读者和N个作家

你的是一个非常典型的生产者/消费者应用程序。生产者(读取套接字的线程)获取数据,将其放入队列,然后一个或多个消费者(处理线程)可以读取和处理数据。我不能想到在.NET中使用比使用BlockingCollection更简单,更有效或更有效的方法。

答案 1 :(得分:1)

我会使用BeginXXXX方法,直到您发现它是性能瓶颈。 XXXXAsync方法实现起来相当棘手,除非您使用固定数组并按文档中的描述汇集SocketAsyncEventArgs,否则使用后面的API几乎没有意义。