Нужно ли закрывать и NetworkStream, и TcpClient, или только TcpClient?

Я читаю документацию по TcpClient.Close() и заметил это:

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

Итак, поправьте меня, если я ошибаюсь, но здесь говорится, что если позвонить Close() на TcpClient, то NetworkStream также будет закрыт.

Тогда почему в конце примера кода оба Close() вызываются?

networkStream.Close();
tcpClient.Close();

Можно ли звонить только tcpClient.Close();?


person Ryan Peschel    schedule 30.09.2011    source источник
comment
Да, это не нужно. Использование tcpClient.Close() в этом примере также не нужно, программа сразу после этого завершается :)   -  person Hans Passant    schedule 01.10.2011
comment
До .NET 3.0 и TcpClient, и базовый NetworkStream должны были быть явно закрыты. Начиная с .NET 3.0, базовый NetworkStream закрывается при закрытии TcpClient. Close() и Dispose() в TcpClient эквивалентны, а Close() добавляет некоторую внутреннюю регистрацию.   -  person Matt Davis    schedule 02.02.2013


Ответы (4)


Отвечая на этот вопрос, поскольку никто другой этого не сделал, я могу принять ответ.

По словам Ганса, в вызове NetworkStream.Close() нет необходимости, поскольку TcpClient.Close() закрывает лежащий в его основе NetworkStream.

person Ryan Peschel    schedule 01.10.2011
comment
Однако документ для Close заявляет Calling this method will eventually result in the close of the associated Socket and will also close the associated NetworkStream that is used to send and receive data if one was created. Я подозреваю, что документ GetStream устарел - это примечание было там с .NET 2.0 (когда это все еще было проблемой). - person Sam; 24.07.2013
comment
У меня был тот же вопрос, и я нашел этот пост, исходный код ссылки подтверждает, что TcpClient.Close также вызывает Close из NetworkStream, поэтому этот ответ правильный. referencesource.microsoft.com/#System/net/ Система/Сеть/Сокеты/ - person R1PFake; 23.09.2018

NetworkStream и TcpClient реализуют IDisposable. Поэтому, на мой взгляд, лучше всего упаковать его в блок использования, чтобы вам никогда не приходилось закрывать или удалять его вручную.

person NickD    schedule 02.10.2011

Закрытие клиента не закрывает поток, это в документе метода GetStream. Для справки взгляните на это обсуждение: Как правильно и полностью закрыть/сбросить соединение TcpClient?

person Vivien Ruiz    schedule 02.10.2012
comment
Как пишет здесь Сэм, эта заметка устарела. Раньше это было необходимо, но с .NET 3.0 это больше не нужно. - person user247702; 15.05.2017

Вы должны просто сделать "TcpClient.Close()"
Или, если необходимо, введите оба

person user975017    schedule 02.10.2011