C# DateTime对象内存泄漏?

C# DateTime对象内存泄漏?,c#,.net,memory-leaks,C#,.net,Memory Leaks,我有一个内存泄漏问题,我相信这是由DateTime对象引起的。我的代码从客户端接收一个整数,创建一个DateTime对象,从该对象生成一个整数,将其与客户端发送的数据进行比较,然后将数据发送回客户端。这种情况每1000毫秒发生一次,当客户机发送一个请求进行ping时 客户端代码: private void sendPingRequest() { List<byte> payloadData = new List<byte>(); DateTime now

我有一个内存泄漏问题,我相信这是由DateTime对象引起的。我的代码从客户端接收一个整数,创建一个DateTime对象,从该对象生成一个整数,将其与客户端发送的数据进行比较,然后将数据发送回客户端。这种情况每1000毫秒发生一次,当客户机发送一个请求进行ping时

客户端代码:

private void sendPingRequest()
{
    List<byte> payloadData = new List<byte>();
    DateTime now = DateTime.UtcNow;
    int seconds = now.Second;
    int ms = now.Millisecond;
    int totalMs = (1000 * seconds) + ms;
    payloadData.AddRange(BitConverter.GetBytes((short)26));
    payloadData.AddRange(BitConverter.GetBytes(4));
    payloadData.AddRange(BitConverter.GetBytes(totalMs));
    client.GetStream().Write(payloadData.ToArray(), 0, payloadData.Count);
    return;
}
private void sendPingRequest()
{
List payloadData=新列表();
DateTime now=DateTime.UtcNow;
int秒=现在。秒;
int ms=现在。毫秒;
整数总毫秒=(1000*秒)+毫秒;
payloadData.AddRange(BitConverter.GetBytes((短)26));
payloadData.AddRange(BitConverter.GetBytes(4));
payloadData.AddRange(BitConverter.GetBytes(totalMs));
client.GetStream().Write(payloadData.ToArray(),0,payloadData.Count);
返回;
}
服务器端代码:(在tcplistener读取所有数据之后)

private void handlePing(字节[]数据,TcpClient发送方)
{
int pingRequest=BitConverter.ToInt32(数据,0);
DateTime now=DateTime.UtcNow;
int秒=现在。秒;
int ms=现在。毫秒;
整数域=(1000*秒)+毫秒;
int diff=领域-pingRequest;
List backData=新列表();
AddRange(BitConverter.GetBytes((short)27));
backData.AddRange(BitConverter.GetBytes(4));
AddRange(BitConverter.GetBytes(diff));
sender.GetStream().Write(backData.ToArray(),0,backData.ToArray().Length);
}
当服务器接收到其中一个ping请求并发回数据时,应用程序的总内存开始缓慢增加,并且速度呈指数级增长。

谢谢,非常感谢您的帮助

表示当您关闭客户端时,您得到的流不会被关闭

根据您的一般处理方式,如果此函数是在TcpClient流上运行的唯一函数,您可能应该关闭它。甚至可以使用
块:

var stream = sender.GetStream();
stream.Write(backData.ToArray(), 0, backData.ToArray().Length);
stream.Close();


DateTime对象不太可能导致内存泄漏。通常,如果对象不是一次性的,并且没有事件订阅(对于持久实例),那么它不应该是内存泄漏的根本原因。您确实需要一个合适的工具(例如:)来分析内存泄漏

您提供的代码不足以说明内存泄漏。但是,请记住,当您不再需要一次性物品时,必须将其处理掉。使用“using”创建本地一次性对象时,它将在实例超出范围时处理该实例。特别是当您使用任何类型的流时,最好将它们包装在using子句中。它将关闭它并为您处置(处置时)


所以,是的。尝试处置所有一次性物品,然后再次测试。”backData的对象在我看来很可疑。确保清理或妥善处理

List backData=新列表();-在三个街区的上方宣布。套接字正在将其写回客户端的字节[]。为什么您认为存在内存泄漏?GC可能还没有启动。这些方法看起来不错。你有没有试过用发送没有任何逻辑的固定包来代替它们?我怀疑问题可能出在代码的其他地方。听起来你并没有向我关闭一个流。您是否考虑过使用内存分析工具来检查GC根目录可以看到的实例?我敢打赌这是一个糟糕的编程,而不是一个问题framework@Charleh是的,但是。。不要急于下注。在进一步研究之后,即使从客户端接收数据时没有执行任何代码,内存泄漏仍然会发生。我会更新我的问题。
var stream = sender.GetStream();
stream.Write(backData.ToArray(), 0, backData.ToArray().Length);
stream.Close();
using(var stream = sender.GetStream())
{
    stream.Write(backData.ToArray(), 0, backData.ToArray().Length);
}