需要关闭NetworkStream和TcpClient吗,还是只需要关闭TcpClient?

18
我正在阅读TcpClient.Close()的文档,并注意到以下内容:
调用此方法最终将导致关联的Socket关闭,并且如果创建了一个NetworkStream,则还会关闭用于发送和接收数据的关联的NetworkStream。
所以,请纠正我如果我错了,这意味着如果在TcpClient上调用Close(),则NetworkStream也将被关闭。
那么为什么在代码示例的结尾都调用了Close()呢?
networkStream.Close();
tcpClient.Close();

只调用tcpClient.Close();是否就可以了?


2
是的,这并不是必需的。在那个例子中使用tcpClient.Close()也是不必要的,程序在那之后立即终止 :) - Hans Passant
5
在.NET 3.0之前,TcpClient和底层的NetworkStream都需要显式关闭。从.NET 3.0开始,在关闭TcpClient时底层的NetworkStream会被关闭。TcpClient上的Close()和Dispose()是等效的,Close()会添加一些内部日志记录。 - Matt Davis
4个回答

18

因为没有其他人回答这个问题,所以我来回答并接受答案。

根据汉斯所说,调用NetworkStream.Close()是不必要的,因为TcpClient.Close()会关闭其底层的NetworkStream。


2
这个答案是不正确的。请参考 Vivien 的回答。正如在那里所指出的,GetStream 的文档 指出 当你完成发送和接收数据时,必须关闭 NetworkStream。关闭 TcpClient 不会释放 NetworkStream。 - BitMask777
5
然而,Close文档中指出,“调用此方法最终将导致关联的Socket关闭,并且如果已创建一个用于发送和接收数据的关联NetworkStream,则还将关闭其。” 我怀疑GetStream文档已过时 - 自.NET 2.0以来(当时还存在这个问题),该注释就已经存在了。 - Sam
1
我曾经有同样的问题,并找到了这篇文章,参考源代码证实TcpClient.Close也会调用NetworkStream的Close方法,所以这个答案是正确的。https://referencesource.microsoft.com/#System/net/System/Net/Sockets/TCPClient.cs,943f9db3a7511918 - R1PFake

2

根据Sam在这里的写作,那个注释已经过时了。在.NET 3.0之后,不再需要这样做。 - user247702

2

NetworkStream和TcpClient实现了IDisposable接口。所以在我看来,最佳实践是将它们放入using块中,这样您就不需要手动关闭或释放它们。


-5
你应该只需执行 "TcpClient.Close()"
或者如果必须的话,两种方法都打出来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接