2011-09-30 76 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

相关问题