Мне нужен Socket.Close ()? - PullRequest
       17

Мне нужен Socket.Close ()?

3 голосов
/ 11 января 2010

Я сейчас изучаю асинхронные сокеты C # и заметил кое-что, что меня смущает.

Во всех концах ... (Принять / Подключиться) и т. Д. Есть раздел кода, например:

Socket s = (Socket) ar.AsyncState;

Здесь это отлито как сокет.

Поскольку каждый Конец использует эти локальные Сокеты, есть ли смысл пытаться close() любой из них, как только я закончу?

Какая лучшая практика?

Ответы [ 7 ]

4 голосов
/ 11 января 2010

Большинство авторов сходятся во мнении, что если что-то реализует IDisposable, вам следует вызвать Dispose. Самый простой способ сделать это - использовать ' using ', который автоматически вызывает Dispose для вас.

using (DirectoryEntry de = new DirectoryEntry(path))
{
.... some code
}
2 голосов
/ 11 января 2010

Я думаю, что лучшая практика для сокетов похожа на таковую для потоков. Лично я всегда использую методы close () как в сокетах, так и в потоках. Если что-то было открыто, оно должно быть правильно закрыто:)

1 голос
/ 11 января 2010

Я предлагаю удалить или закрыть поток после того, как вы закончите. Это позволяет системе немедленно освободить сетевые ресурсы, как только вы закончите с вашим сокетом.

Если вы используете сокет из одной функции, оператор using работает хорошо, поскольку он неявно удаляет ваш объект. В противном случае (например, при сохранении сокета активным, сохраняя ссылку на него в объекте), вы захотите вызвать Close() или Dispose(), когда закончите. В противном случае розетка может оставаться открытой бесконечно долго. Dispose() может быть немного лучшим выбором, поскольку он освобождает больше ресурсов, чем Close().

MSDN может пропустить Close, потому что сокет будет автоматически закрыт по окончании процесса, когда оставшиеся ресурсы будут собираться мусором.

1 голос
/ 11 января 2010

Либо с помощью

using(Socket s)
{
...
}

или с помощью розетки, открытой и в конце закрывающей розетку.

Если вы оставите сокет открытым и попытаетесь открыть его снова где-нибудь еще, тогда произойдет ошибка времени выполнения ... Все потоки dataReaders, соединения должны быть закрыты. Основными причинами являются: 1. безопасность 2. трата памяти 3. склонны к ошибкам во время выполнения

1 голос
/ 11 января 2010

Закрытие ваших розеток имеет решающее значение. Тот факт, что вы не замечаете никаких негативных последствий в конкретной версии Framework, не означает, что в будущей реализации Framework может оставить ресурсы в использовании до тех пор, пока он не будет закрыт. Скорее всего, вы также оставляете ресурсы в системе. Плюс, это не больно. : Р

Объект, вероятно, освобождает свои ресурсы и имплицитно закрывает сокет, когда он уничтожается, но в такой автоматической среде сбора мусора, как C #, вы никогда не знаете, когда это может произойти.

1 голос
/ 11 января 2010

В конце концов он закроется, даже если вы этого не сделаете (когда включается сборщик мусора), однако лучшие практики требуют, чтобы вы закрывали ручки для объектов, когда они больше не нужны.

Рассматривайте файловые потоки, если не закрыть файловый поток, это может означать, что данные не будут записаны в файл. Подобные проблемы могут возникнуть, если вы не закроете дескриптор объектов, которые должны быть закрыты.

0 голосов
/ 25 декабря 2013

Socket.Close вызывает Уничтожить. Вызов Dispose, явно или неявно, для объекта IDisposable обязателен . Интерфейс IDisposable предназначен для объектов, которые используют неуправляемые ресурсы, поэтому разрешение на сборку мусора без вызова команды dispose приведет к утечке ресурсов. Короткий пример программы может не показать эту проблему, но полная, длительная проблема, безусловно, столкнется с проблемами.

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