Использование
client.BeginReceive(state.buffer,0,StateObject.BufferSize,0,
new AsyncCallback(ReceiveCallback), state);
не не автоматически вызывает метод ReceiveCallback, этот метод вызывается после завершения операции.
Тем временем метод, который вызвал BeginReceive
, продолжает выполняться, делать то, что он делает, и возвращаться счастливо, таким образом удаляя себя из стека.
Когда вы используете рекурсию, каждый вызов добавляет фрейм стека (см. Комментарий) , который не выталкивается, пока не будет вызван вызываемый метод, поэтому стек увеличивается до тех пор, пока рекурсия не будет завершена.