我正在做我的第一步与C#中的异步/等待,为此我想写一个简单的TCP服务器接收简单的字符串(现在)。 因此,我设置了一个Windows服务,其中包含一个循环,用于监听传入连接,接受这些连接并关闭套接字(我打算将字符串写入日志文件或其他东西,但这必须等到问题出现为止我即将形容解决)。异步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();
}
谢谢!
4.7KB(你的意思是MB?)使用过的内存没有多少说明,因为GC可能认为它不值得运行一个集合。您可以尝试手动添加'GC.Collect()'调用并查看是否释放内存,但是在分析应用程序并查看是否有任何对象位于手动强制集合后不再使用的情况下(他们的参考树一直到应用程序根目录)。 – easuter