Это полностью задумано.Вы сделали что-то исключительное, вы закрыли сокет, хотя ожидали, что данные будут получены.Таким образом, вы получите исключение..NET Framework всегда гарантирует, что асинхронные вызовы завершены и что причина прерывания сообщается в обратном вызове при вызове EndXxx ().Хорошая идея, которая позволяет очистить любое состояние, связанное с обратным вызовом.
Вы можете сделать его неисключительным, дождавшись завершения передачи, прекратить вызывать BeginReceive () и затем closeрозетка.Но это не всегда практично, а иногда вы действительно хотите закончить рано.Не проблема, просто перехватите ObjectDisposedException и выйдите.Конечно, do учитывает, что происходит с приложением на другом конце провода.Все, что он отправит позже, попадет в корзину, и у него не будет возможности это выяснить.