2011-09-30 10 views
14

estoy leyendo the documentation on TcpClient.Close() y dado cuenta de esto:¿Es necesario cerrar NetworkStream y TcpClient, o simplemente TcpClient?

llamada a este método con el tiempo como resultado el cierre del zócalo asociado y también cerrará la NetworkStream asociado que se utiliza para enviar y recibir datos si se ha creado.

Así, corrígeme si me equivoco, pero esto dice que si uno llama Close() en el que el TcpClientNetworkStream también estará cerrada.

Entonces, ¿por qué al final del ejemplo de código se llaman ambos Close()?

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

¿Sería igual de bueno llamar solo al tcpClient.Close();?

+1

Sí, no es necesario. Tampoco es necesario usar tcpClient.Close() en ese ejemplo, el programa termina inmediatamente después de eso :) –

+3

Antes de .NET 3.0, tanto el TcpClient como el NetworkStream subyacente tenían que cerrarse explícitamente. A partir de .NET 3.0, el NetworkStream subyacente se cierra al cerrar el TcpClient. Close() y Dispose() en TcpClient son equivalentes, con Close() añadiendo algunos registros internos. –

Respuesta

9

Respondiendo a esta pregunta ya que nadie más lo hizo para que yo pueda aceptar una respuesta.

Según Hans, no se necesita llamar a NetworkStream.Close() porque TcpClient.Close() cierra su NetworkStream subyacente.

+2

Esta respuesta es incorrecta. Ver la respuesta de Vivien. Como se indica allí, el [documento para GetStream] (http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.getstream.aspx) indica 'debe cerrar el NetworkStream cuando haya terminado enviando y recibiendo datos. Cerrando TcpClient no lanza el NetworkStream. – BitMask777

+4

Sin embargo, el [documento para Cerrar] (http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.close.aspx) establece 'Calling este método eventualmente resultará en el cierre del Socket asociado y también cerrará el NetworkStream asociado que se usa para enviar y recibir datos, si se creó. Sospecho que el documento GetStream está desactualizado, esa nota ha estado allí desde entonces. NET 2.0 (cuando todavía era un problema). – Sam

-6

sólo debe hacer "TcpClient.Close()"
o si debe, escriba tanto

2

NetworkStream y TcpClient implementan IDisposable. Entonces, la mejor práctica, en mi opinión, es empacarla en un bloque de uso, para que nunca tenga que cerrarla o desecharla manualmente.

1

Al cerrar el cliente no se cierra la secuencia, está en el documento del método GetStream. Para referencia, eche un vistazo a esta discusión: How to properly and completely close/reset a TcpClient connection?

+0

[Como Sam escribe aquí] (http://stackoverflow.com/questions/7617127/does-one-need-to-close-both-networkstream-and-tcpclient-or-just-tcpclient#comment26031079_7623611), esa nota es fuera de plazo. Solía ​​ser necesario, pero desde .NET 3.0 ya no lo es. – Stijn

Cuestiones relacionadas