异步套接字服务器中的OutOfMemoryException

时间:2017-05-17 13:21:25

标签: c# sockets async-await cancellationtokensource

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

以下是示例代码


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); } }

它工作正常但是我在一段时间后出现了内存异常。有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您的TcpClient实例永远不会丢弃,因此它们将保持打开状态,直到您的程序内存不足并被操作系统关闭。

完成使用后,您需要关闭TcpClient。执行此操作的最佳方法是将其包装在using块中:

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

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