c# - 为什么我要在 TCP 客户端关闭后强制进行垃圾回收?

标签 c# .net sockets tcp

我正在处理一些可能早于 .NET 2 的遗留代码。库本身是我们的服务器使用的自定义异步 TCP 通信层。

那里有一个继承自 System.Net.Sockets.TcpClient 的类以及围绕它实现处置模式和终结器(后者可能不需要)的整个类层次结构。

我的问题是关于在处理 TCP 客户端断开连接事件的方法中发现的可疑代码行:

// Hack to ensure that client has disconnected
GC.Collect();

这是在调用处理我们的通信类层次结构的方法之后执行的,最终调用 System.Net.Sockets.TcpClient Dispose 方法。

在可以为许多客户端提供服务并使用千兆字节 RAM 的 64 位服务器上,这些调用可能非常昂贵。我找不到任何有关在 TCP 客户端断开连接时强制进行垃圾收集的信息?

最佳答案

使用 GC.Collect() 强制 GC 后会发生两件事。

  1. 没有终结器的无法访问的对象所使用的内存将被回收。
  2. 实现终结器的对象将被放入终结器队列,很快就会执行终结器。

评论表明 GC.Collect() 不是调用来回收内存,而是执行终结器来处理非托管资源。

如果正确使用IDisposable,就不需要依赖终结器。可能有一些 IDisposable 对象未正确 Disposed。你必须找到他们。一种方法是检查执行了哪些终结器。一些内存分析器也可以跟踪此类对象(例如 .NET memory profiler's Dispose Tracker)。

关于c# - 为什么我要在 TCP 客户端关闭后强制进行垃圾回收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34185318/

相关文章:

.net - 如何在 TeamCity 中查看 .NET 跟踪日志?

.net - 用于修改面孔的图像处理库/API

java套接字输出流和破管

c++ - 在 Windows 中是否有易于实现或现有的协议(protocol)来通过管道/套接字传递对象?

c# - linq2sql : Cannot add an entity with a key that is already in use

c# - LINQ to Entities 无法识别方法 'get_Day()' 方法

C# 连接到端口 990 时 FTPS 卡住/超时

c# - GroupBy 的 LINQ 错误

c# - DbConnection 与 OleDbConnection 与 OdbcConnection

android - 如何在 Android 和 QT 之间使用 TCP 套接字传输对象?