【问题标题】:C# Do we need to close TCPClient by using TCPClient.Close if it is no more used?C# 如果不再使用 TCPClient.Close 是否需要关闭它?
【发布时间】:2012-07-28 20:03:13
【问题描述】:

我正在制作一个向许多 TCP 侦听器发送数据的程序。如果其中一个 TCP 发送通道不再使用,我们是否需要使用 TCPClient.close 将其关闭。如果我们让它打开会发生什么?

谢谢!

【问题讨论】:

    标签: c# tcp tcpclient


    【解决方案1】:

    我不会明确使用Close - 我只是通过using 声明来处理它:

    using (TcpClient client = ...)
    {
        // Use the client
    }
    

    如果我们让它打开会发生什么?

    如果双方都没有关闭连接,它就会毫无意义地坐在那里无所事事。

    如果另一端关闭连接,我怀疑你会在 TIME_WAIT 或类似的情况下建立本地连接;我不知道确切的细节,但这并不理想。

    主要的一点是它可能会占用一些系统资源,而且从根本上来说并不理想。它会导致你的程序崩溃和你的系统发疯吗?可能不会——至少除非你要创建大量这样的东西。不过,使用非内存资源处理任何东西仍然是一个好主意。

    【讨论】:

    • 感谢您的回答。嗯..“使用”声明..我以前从未使用过。需要阅读它。那么,使用“关闭”是不好的?
    • @user1034912:Close 不会彻底清理资源,但 dispose 会。 “使用”块为您调用 Dispose()...
    • @user1034912: Close() 并不“坏”——它只是不如通过using 语句使用Dispose 方便。任何时候你都应该使用using 声明,当你有一些一次性的东西被创建然后在本地范围内完成。
    • 我刚刚阅读了有关使用的信息。 “使用”不限于大括号吗?即它离开大括号的那一刻,对象被处理了吗?我的 TCP 客户端跨越了更大的代码段。
    • @user1034912:在这种情况下,您可能应该将其设为另一个实现IDisposable的类的成员,并为此编写using语句。如果不知道你在做什么的细节,很难给出一个详细的答案。
    【解决方案2】:

    如果您将其保持打开状态,GC(垃圾收集器)将及时处理您的对象。

    使用 TCPClient,终结器(GC 清理对象时运行的代码)调用 Dispose(),从而关闭连接并释放它使用的任何操作系统资源。

    您不知道 GC 何时进行清理,因此这种方法是不确定的。这可能不是一个或两个打开连接的问题,但如果您打开大量这些连接,您可能会耗尽系统资源。

    一个好的做法是在使用完 TCPClients 后始终将其释放,这可以通过 using 块轻松完成。 (如 Jon Skeets 的回答所示......)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 2011-08-14
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多