Я знаю, что эта ветка довольно старая, но я только что столкнулся с той же проблемой, и меня не удовлетворил ответ, данный здесь (или где-либо еще по этому вопросу).
Лучшее решение для отмены ожидающего Socket.BeginReceive
вызова - Socket.Shutdown
, а не Socket.Close
. Таким образом, асинхронный обработчик вызывается «нормально», и вызов Socket.EndReceive
возвращает 0 -> вместо того, чтобы выдавать уродливое ожидаемое исключение.
Вы всегда должны иметь
if (Socket.EndReceive() > 0) {
//Do something
} else {
//Socket has been shut down (either by you or the other end of the connection)
//Now it's "safe" to call Socket.Close
Socket.Close();
}
так что вам даже не нужно настраивать асинхронный обратный вызов для обработки отмены вручную.