Обрабатывать пакеты в асинхронном цикле или нет?

StackOverflow https://stackoverflow.com/questions/604483

  •  03-07-2019
  •  | 
  •  

Вопрос

В C# при получении сетевых данных с помощью методов BeginReceive/EndReceive есть ли какая-либо причина, по которой вам не следует обрабатывать пакеты сразу после их получения?Некоторые задачи могут быть достаточно ресурсоемкими.Я спрашиваю, потому что видел некоторые реализации, которые помещают пакеты в очередь обработки и затем обрабатывают их там.Мне это кажется излишним, потому что, насколько я знаю, асинхронные методы также работать с пулом потоков.

Это было полезно?

Решение

Как указывает Митч, вам необходимо иметь возможность получать достаточно пакетов, чтобы получить полное сообщение/кадр.Но нет причин, по которым вам не следует немедленно начать обработку этого кадра и выдать еще один BeginReceive.Фактически, если вы считаете, что ваша обработка может занять некоторое время, вам лучше передать ее рабочему пулу потоков, а не блокировать поток из пула ввода-вывода (именно там сработает ваш обратный вызов).

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

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

Другие советы

Как правило, вам необходимо получить «достаточное» количество пакетов, чтобы иметь элемент данных, который можно «обработать».

ИМХО, лучше иметь один поток, чья работа заключается в получении данных, а другой - для их фактической обработки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top