【发布时间】:2012-07-28 20:03:13
【问题描述】:
我正在制作一个向许多 TCP 侦听器发送数据的程序。如果其中一个 TCP 发送通道不再使用,我们是否需要使用 TCPClient.close 将其关闭。如果我们让它打开会发生什么?
谢谢!
【问题讨论】:
我正在制作一个向许多 TCP 侦听器发送数据的程序。如果其中一个 TCP 发送通道不再使用,我们是否需要使用 TCPClient.close 将其关闭。如果我们让它打开会发生什么?
谢谢!
【问题讨论】:
我不会明确使用Close - 我只是通过using 声明来处理它:
using (TcpClient client = ...)
{
// Use the client
}
如果我们让它打开会发生什么?
如果双方都没有关闭连接,它就会毫无意义地坐在那里无所事事。
如果另一端关闭连接,我怀疑你会在 TIME_WAIT 或类似的情况下建立本地连接;我不知道确切的细节,但这并不理想。
主要的一点是它可能会占用一些系统资源,而且从根本上来说并不理想。它会导致你的程序崩溃和你的系统发疯吗?可能不会——至少除非你要创建大量这样的东西。不过,使用非内存资源处理任何东西仍然是一个好主意。
【讨论】:
Close() 并不“坏”——它只是不如通过using 语句使用Dispose 方便。任何时候你都应该使用using 声明,当你有一些一次性的东西被创建然后在本地范围内完成。
IDisposable的类的成员,并为此编写using语句。如果不知道你在做什么的细节,很难给出一个详细的答案。
如果您将其保持打开状态,GC(垃圾收集器)将及时处理您的对象。
使用 TCPClient,终结器(GC 清理对象时运行的代码)调用 Dispose(),从而关闭连接并释放它使用的任何操作系统资源。
您不知道 GC 何时进行清理,因此这种方法是不确定的。这可能不是一个或两个打开连接的问题,但如果您打开大量这些连接,您可能会耗尽系统资源。
一个好的做法是在使用完 TCPClients 后始终将其释放,这可以通过 using 块轻松完成。 (如 Jon Skeets 的回答所示......)
【讨论】: