异步TCP服务器中的内存泄漏(Windows服务)

时间:2017-08-17 12:51:53

标签: c# asynchronous tcp server async-await

我正在使用C#中的async / await执行我的第一步,为此我想编写一个接收简单字符串的简单TCP服务器(暂时)。 所以我设置了一个Windows服务,其中包含一个正在侦听传入连接的循环,接受这些连接并关闭套接字(我打算将字符串写入日志文件或其他东西,但这必须等到问题我即将描述已解决)。

无论如何,问题是在通过网络收到一些字符串后,我的服务占用了以后没有发布的内存。当我启动该服务并且没有连接进入时,该过程采用4.716K。当接受连接时,这个数量会增加(正如我预期的那样),但之后资源似乎不会被释放......

可能,我忽略了一些东西,但我找不到解决方案(虽然“项目”现在只包含几行代码)所以我非常感谢你的帮助,伙计们:/

这些是启动/关闭事件处理程序:

protected override void OnStart(string[] args)
{
    this.listener = new TcpListener(IPAddress.Any, 7777);
    this.listener.Start();

    this.worker = new Thread(StartServer);
    this.worker.Start();
}

protected override void OnStop(string[] args)
{
    this.serviceIsRunning = false;
    this.worker.Join();

    // TODO: Cancellation token maybe?
}

这就是服务器循环:

private async void ServerStart(object arguments)
{
    while (serviceIsRunning)
    {
        TcpClient client = await listener.AcceptTcpClientAsync();
        Task requestTask = HandleRequest(client);
    }

    this.listener.Stop();
}

连接处理程序:

private async Task HandleRequest(TcpClient client)
{
    using (var stream = new StreamReader(client.GetStream(), Encoding.UTF8))
    {
        // Do something with it
        string request = await stream.ReadToEndAsync();
    }

    // Gracefully close connection
    client.Close();
}

谢谢!

1 个答案:

答案 0 :(得分:2)

内存使用率非常低。我已经看到垃圾收集器等到我运行之前3d模型/图像消耗了2千兆字节的内存。如果您随着时间的推移观察应用程序的行为,您将在大量运行中看到峰值和谷值。我建议做两个实验。

  1. 启动任务管理器,在空闲状态下运行您的进程几秒钟,然后从服务器发送一些大量数据,以便处理请求大约100-1000次,然后让它保持打开一些几秒钟然后关闭它。内存使用量应该返回到应用程序打开之前的位置。

  2. 遵循几乎相同的过程,但这次,在处理请求后调用垃圾收集器(GC.Collect())。检查这次你的内存使用情况是否不同。

  3. 如果这不能按预期工作,请尝试创建和销毁TCP服务器类。内存使用量应恢复正常。这会将问题隔离到您的班级或垃圾收集器。