2011-09-30 94 views
14

我讀the documentation on TcpClient.Close()並注意到了這一點:是否需要關閉NetworkStream和TcpClient,或只是TcpClient?

調用此方法將最終導致在相關插座的接近,也將關閉關聯的NetworkStream用來發送和如果創建接收數據。

所以,糾正我,如果我錯了,但是這說,如果一個在TcpClient調用Close()NetworkStream也將被關閉。

那麼爲什麼在代碼示例的末尾都調用了Close()

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

只要撥打tcpClient.Close();就可以了嗎?

+1

是的,這是沒有必要的。在該示例中使用tcpClient.Close()也不是必需的,程序在此之後立即終止:) –

+3

在.NET 3.0之前,必須顯式關閉TcpClient和底層NetworkStream。從.NET 3.0開始,當關閉TcpClient時,底層NetworkStream被關閉。 Close()和Dispose()在TcpClient上是等價的,用Close()添加一些內部日誌記錄。 –

回答

9

迴應這個問題,因爲沒有其他人這樣做,我可以接受答案。

根據Hans的說法,調用NetworkStream.Close()是不必要的,因爲TcpClient.Close()關閉了其底層NetworkStream。

+2

這個答案不正確。見Vivien的回答。如上所述,[GetStream文檔](http://msdn.microsoft.com/zh-cn/library/system.net.sockets.tcpclient.getstream.aspx)指出:「您必須在您通過時關閉NetworkStream發送和接收數據。關閉TcpClient不會釋放NetworkStream.' – BitMask777

+4

然而,[doc for Close](http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.close.aspx)指出'調用這個方法最終會導致關聯的Socket關閉,並且還會關閉用於發送和接收數據的關聯NetworkStream(如果創建的話)。「我懷疑GetStream文檔已經過時 - 從那以後,這個註釋一直存在。 NET 2.0(當它仍然是一個問題)。 – Sam

-6

你應該做的 「TcpClient.Close()」
或者,如果您必須鍵入兩個

2

的NetworkStream和TcpClient的實現IDisposable。所以在我看來,最好的做法是將它打包成一個使用塊,所以你永遠不需要關閉或手動處理它。

1

關閉客戶端不關閉流,它在GetStream方法的文檔中。 供參考,看看這個討論:How to properly and completely close/reset a TcpClient connection?

+0

[正如山姆在這裏寫的](http://stackoverflow.com/questions/7617127/does-one-need-to-close-both-networkstream-and-tcpclient-or-just-tcpclient#comment26031079_7623611),那個提示是外的日期。它曾經是必需的,但是從.NET 3.0開始它不再是了。 – Stijn

相關問題