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