Что произойдет, если вы никогда не позвоните Socket.EndConnect? - PullRequest
6 голосов
/ 17 января 2011

Использование .Net 4.0.У меня есть некоторый код, который пытается открыть соединение с помощью BeginConnect и обратного вызова.Если пользователь пытается остановить программирование в следующие несколько минут, я пытаюсь отключиться.В этот момент я установил флаг, чтобы указать, должен ли EndConnect вызываться из обратного вызова.Если флаг установлен в false, я пропускаю EndConnect, потому что сокет все равно был уничтожен.

В этот момент пользователь может попытаться подключиться снова немедленно.Я не вижу этого, но на всякий случай.Теперь создается новый сокет и снова вызывается BeginConnect.

Разве нормально никогда не вызывать метод EndConnect?

1 Ответ

3 голосов
/ 17 января 2011

Во всех случаях (кроме одного [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, где исключение явно задокументировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...