Обрабатывать пакеты в асинхронном цикле или нет? - PullRequest
0 голосов
/ 03 марта 2009

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

Ответы [ 2 ]

3 голосов
/ 03 марта 2009

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

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

1 голос
/ 03 марта 2009

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

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

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

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