我正在编写套接字服务器程序。它将侦听特定的 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);
}
}
它工作正常,但一段时间后我出现内存不足异常。有没有办法解决这个问题?
您的TcpClient
实例永远不会被释放,因此它们将保持打开状态,直到您的程序内存不足并被操作系统关闭。
TcpClient
使用完后需要关闭。最好的方法是将它包装在一个using
块中:
using(TcpClient client = await listener.AcceptTcpClientAsync().ConfigureAwait(true))
{
clientCounter++;
EchoAsync(client, clientCounter, ct);
}
另一种方法是使用其Close()
方法手动关闭它,但请注意,如果在调用之前抛出异常,Close()
您TcpClient
将永远保持打开状态。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句