首页 > 解决方案 > NET5 Windows 服务进程停止后卡在“暂停”状态

问题描述

程序描述:我有一个非常活跃的服务器应用程序作为 Windows 服务运行,用于与物联网设备进行通信(每分钟超过数千次)。一些做 UDP,一些 TCP,一些 HTTP,总是从服务器端建立连接。它不是我知道以这种方式挂起进程的“UWP”应用程序。主机是 Windows Server 2019。

该项目之前的目标是 .NET 4.7.2,并用于System.ServiceProcess.ServiceBase作为服务运行。它还在同步模式下进行所有通信。它没有这个问题。

然后我进行了大规模升级并将其移植到 .NET5,使用Microsoft.Extensions.Hosting.Host带有UseWindowsService()MS DI 容器的类,并将所有通信代码移植到 async/await。

现在,大多数情况下进程关闭或崩溃,它卡在“暂停”状态的 Windows 任务管理器中,如下面的屏幕截图所示:

任务管理器

只有第一个进程是活动的,其余的都是“幽灵”。这些幽灵不会等待某些网络通信超时或其他什么,它们可以在那里停留数周。

我无法终止进程。右键单击“结束任务”什么也不做。即使在具有完全管理权限的用户的管理员命令提示符下,我也会收到此错误:

taskkill /F /PID 9100
ERROR: The process with PID 9100 could not be terminated.
Reason: Access is denied.

我可以摆脱它们的唯一方法是重新启动服务器。

幸运的是,它们不浪费资源,也不锁定文件,所以我仍然可以更新程序并重新启动它。

在开发机器或测试服务器上运行的相同应用程序没有此问题,它仅在生产服务器上的高负载时发生。

我唯一能想到的是,我不会将关闭 CancellationToken 传播到我的所有异步任务,但无论如何它们都应该在几秒钟后完成。

我的问题是:有什么方法可以找出导致这种症状的原因吗?有什么方法可以诊断出是什么让进程保持这样锁定?

标签: c#windows-services.net-5

解决方案


推荐阅读