Сокет клиента C # 1 Непрерывные данные - PullRequest
1 голос
/ 08 марта 2011

Я пишу сервис, который будет подключаться к одному сокету, а затем считывать данные, которые будут непрерывными и порой изобильными. Затем полученные данные должны быть переданы другому потоку (в сервисе) для обработки, причина в том, что обработка может занять некоторое время, и я не хочу блокировать получение сокета.

Я собирался сделать это, используя методы получения Begin или Async для обработки данных, а не поток, выполняющий чтение параллельной очереди или что-то в этом роде. Мне нужно это, чтобы масштабировать до возможно больших объемов данных, поступающих через сокет. Какие-либо предложения?

Ответы [ 2 ]

5 голосов
/ 08 марта 2011

Я не уверен, как использование асинхронного приема поможет с обработкой.Насколько я понимаю, у вас будет один поток, который подключается к сокету и читает непрерывный поток данных.Я предполагаю, что поток может разбить этот непрерывный поток на записи какого-либо типа или, по крайней мере, на блоки управляемого размера.Затем вам нужно сделать эти данные доступными для одного или нескольких потоков обработки.

Я настоятельно рекомендую вам использовать параллельную очередь (фактически BlockingCollection) для связи между потоком, который читает данные, ипоток или потоки, которые будут выполнять обработку.Есть несколько причин, по которым я предлагаю использовать BlockingCollection:

  • Это просто в использовании - нет явного кода блокировки
  • Это делает незанятые ожидания
  • Он обрабатываетN читателей и N писателей эффективно

Ваше довольно типичное приложение для производителей и потребителей.Производитель (поток, читающий сокет) получает данные, помещает их в очередь, и затем один или несколько потребителей (потоков обработки) могут читать и обрабатывать данные.Я не могу придумать более простой, более эффективный или более эффективный способ сделать это в .NET, чем с BlockingCollection.

1 голос
/ 08 марта 2011

Я бы использовал методы BeginXXXX, пока не обнаружил, что это узкое место в производительности.Методы XXXXAsync значительно сложнее реализовать, и если вы не используете закрепленный массив и не объединяете SocketAsyncEventArgs, как описано в документации, использование более позднего API не имеет смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...