Да, это действительно странное поведение. Тем не менее, вот как я это вижу ... это может быть неправильно, но я пришел, чтобы объяснить это себе после долгих часов отладочной сессии:
Когда вы используете «Получить нормально» (синхронизировано), он читает n байтов, а затем возвращает… отлично.
Когда вы используете BeginReceive (асинхронно), он вызывает вас, когда начинает , чтобы прочитать n байтов.
Итак, другими словами, он действительно пытается прочитать n байтов ... он просто сообщает вам, когда он начинает их получать, а не когда он заканчивается. А потом иногда случается, что чтение n байтов невозможно, но, к сожалению, ваш сигнал начала уже вызван.
Я согласен с вами в том, что имя смешное.
удачи!