异步套接字服务器中的 OutOfMemoryException

OutOfMemoryException in Async socket server

我正在编写套接字服务器程序。它将监听特定的 IP 和端口。一旦数据进入,它就会处理数据并将其存储在数据库中。 我希望我的程序 24*7 监听数据是否进来。如果出现则处理它否则等到新客户端加入

这里是示例代码

<br>static async Task AcceptClientsAsync(TcpListener listener, CancellationToken ct)
{
            try
            {
                var clientCounter = 0;
                while (!ct.IsCancellationRequested)
                {
                    TcpClient client = await listener.AcceptTcpClientAsync().ConfigureAwait(true);
                    clientCounter++;
                    EchoAsync(client, clientCounter, ct);
                }
            }
            catch (Exception e)
            {
                NewLog.WriteErrorLogToBuffer("exception in AcceptClientsAsync " + e.InnerException, false);
            }

}<br>

它工作正常,但一段时间后出现内存不足异常。有什么办法可以解决这个问题吗?

您的 TcpClient 实例永远不会被释放,因此它们将保持打开状态,直到您的程序内存不足并被 OS 关闭。

使用完后需要关闭TcpClient。最好的方法是将其包装在 using 块中:

using(TcpClient client = await listener.AcceptTcpClientAsync().ConfigureAwait(true))
{
    clientCounter++;
    EchoAsync(client, clientCounter, ct);
}

另一种方法是使用其 Close() 方法手动关闭它,但请注意,如果在调用 Close() 之前抛出异常,您的 TcpClient 将永远保持打开状态。