我正在使用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();
}
谢谢!
答案 0 :(得分:2)
内存使用率非常低。我已经看到垃圾收集器等到我运行之前3d模型/图像消耗了2千兆字节的内存。如果您随着时间的推移观察应用程序的行为,您将在大量运行中看到峰值和谷值。我建议做两个实验。
启动任务管理器,在空闲状态下运行您的进程几秒钟,然后从服务器发送一些大量数据,以便处理请求大约100-1000次,然后让它保持打开一些几秒钟然后关闭它。内存使用量应该返回到应用程序打开之前的位置。
遵循几乎相同的过程,但这次,在处理请求后调用垃圾收集器(GC.Collect())。检查这次你的内存使用情况是否不同。
如果这不能按预期工作,请尝试创建和销毁TCP服务器类。内存使用量应恢复正常。这会将问题隔离到您的班级或垃圾收集器。