【问题标题】:Close TcpClient and its underlying NetworkStream关闭 TcpClient 及其底层 NetworkStream
【发布时间】:2014-12-02 20:01:40
【问题描述】:

我现在正在开发一个使用 TCP 协议作为其通信协议的服务器/客户端应用程序。我有两个关于 TcpClient 及其底层 NetworkStream 的问题。我正在搜索,但找不到明确的答案

(1) 如果我使用 TcpClient.Close() 方法关闭 TcpClient,底层的 NetworkStream 是否也会自动关闭?对于 .Net framework 4.5 此处 (http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.getstream(v=vs.110).aspx) 表示“在发送和接收数据时必须关闭 NetworkStream。关闭 TcpClient 不会释放 NetworkStream。”但是,对于 .Net 框架 4.5 此处 ("http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.close(v=vs.110).aspx") 表示“调用此方法 (TcpClient.Close) 最终将导致关联的 Socket 关闭,并且还将关闭用于发送和如果创建了数据,则接收数据。”我现在很困惑。

(2) 如果我保持我的 TcpClient 打开并连接,但我关闭/处置通过调用 TcpClient.GetStream 获得的底层 NetworkStream,我可以通过调用 GetStream 方法再次获得这样的流吗?

感谢您的投入!

【问题讨论】:

    标签: dispose tcpclient networkstream


    【解决方案1】:

    一般规则是,您应该努力处理任何一次性资源,除非众所周知这样做没有好处(最好的例子是Task)。

    如果您发现不想处置TcpClient 或配对的NetworkStream 的重要原因:反射器显示GetStream 将底层套接字的所有权转移给NetworkStream。但是处理两者中的任何一个都会关闭并关闭套接字。

    您可以安全地只处置两者之一,因为套接字是唯一持有的非托管资源。

    这意味着您的第一个引用是一个文档错误。

    我刚才说的是反编译源代码得到的无证知识。依靠这些知识,我会感到非常安全,因为这种行为已经有 10 年了,并且出于兼容性原因永远无法更改。 Microsoft 非常努力地不破坏用户代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      相关资源
      最近更新 更多