Во всех случаях (кроме одного [1] ) вызову BeginZZZ
требуется соответствующий EndZZZZ
.
В противном случае неуправляемые ресурсы будут просачиваться, и вполне возможно, что действие ZZZZ
не будет корректно завершено & mdash; это может повредить дальнейшее использование ZZZZ
позже.
Сокеты довольно устойчивы к злоупотреблениям (стек IP должен обрабатывать сетевые сбои и пакеты не в порядке), но это не делает его хорошей практикой.
Если вы используете флаг для отслеживания «выключения», лучше позвонить по номеру EndConnect
и сразу же закрыть сокет. В конце концов, соединение может само разорваться, и разъединение не требуется (EndConnect
выдает SocketException
). Что-то вроде:
mySocket.BeginConnect(address, port, ia => {
if (shuttingDown) {
try {
mySocket.EndConnect(ia);
mySocket.BeginDisconnect(false, iaa = {
try {
mySocket.EndDisconnect(iaa);
} catch (Exception) { /* Ignore */ }
}, null);
} catch (SocketException) { /* Ignore */ }
} else {
// Normal connection handling
}
}, null);
Также используется асинхронное отключение, чтобы избежать блокировки там.
[1] Исключением является Control.BeginInvoke
в WinForms, где исключение явно задокументировано.