2011-09-30 17 views
14

Sto leggendo the documentation on TcpClient.Close() e notato questo:È necessario chiudere sia NetworkStream che TcpClient o solo TcpClient?

chiamata a questo metodo finirà per determinare la chiusura del socket associato e sarà anche chiudere il NetworkStream associato che viene utilizzato per inviare e ricevere dati se uno è stato creato.

Quindi, mi corregga se sbaglio, ma questo dice che se si chiama Close() sul TcpClient che il NetworkStream sarà anche chiuso.

Allora, perché alla fine dell'esempio di codice sono chiamati sia Close()?

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

Sarebbe altrettanto bello chiamare solo tcpClient.Close();?

+1

Sì, non è necessario. Anche l'utilizzo di tcpClient.Close() in quell'esempio non è necessario, il programma termina subito dopo :) –

+3

Prima di .NET 3.0, sia il TcpClient che il NetworkStream sottostante dovevano essere chiusi esplicitamente. A partire da .NET 3.0, il NetworkStream sottostante viene chiuso alla chiusura di TcpClient. Close() e Dispose() su TcpClient sono equivalenti, con Close() che aggiunge alcune registrazioni interne. –

risposta

9

Rispondere a questa domanda poiché nessun altro ha fatto in modo che io possa accettare una risposta.

Secondo Hans, chiamare NetworkStream.Close() non è necessario perché TcpClient.Close() chiude il suo NetworkStream sottostante.

+2

Questa risposta non è corretta. Guarda la risposta di Vivien. Come indicato qui, il [doc per GetStream] (http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.getstream.aspx) afferma 'È necessario chiudere NetworkStream quando si è attraverso inviare e ricevere dati. Closing TcpClient non rilascia NetworkStream. – BitMask777

+4

Tuttavia, la [doc for Close] (http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.close.aspx) dichiara 'Calling questo metodo alla fine si concluderà con la chiusura dello Socket associato e chiuderà anche il NetworkStream associato utilizzato per inviare e ricevere dati se ne è stato creato uno. Sospetto che il documento GetStream non sia aggiornato - quella nota è stata lì da allora. NET 2.0 (quando era ancora un problema). – Sam

-6

si dovrebbe solo fare "TcpClient.Close()"
O se è necessario, digitare entrambe

2

NetworkStream e TcpClient implementano IDisposable. Quindi la mia pratica migliore è quella di comprimerla in un blocco usando, quindi non è necessario chiuderla o disporla manualmente.

1

La chiusura del client non chiude lo stream, è nel documento del metodo GetStream. Per il riferimento, dare un'occhiata a questa discussione: How to properly and completely close/reset a TcpClient connection?

+0

[Come scrive Sam qui] (http://stackoverflow.com/questions/7617127/does-one-need-to-close-both-networkstream-and-tcpclient-or-just-tcpclient#comment26031079_7623611), quella nota è obsoleto. Era necessario, ma dal momento che .NET 3.0 non lo è più. – Stijn